|
| c til Delphi Fra : Toke Eskildsen |
Dato : 30-11-05 22:37 |
|
Jeg har lykkeligt fortrængt omtrentligt alt jeg har lært om c og er på
ganske ulykkelig vis nødt til at lave et kald ind i en DLL. Dertil har
jeg noget c-kode, som jeg ikke fatter meget af.
Er der mon en venlig sjæl, der kan hjælpe med oversættelse?
Kald til DLL har jeg styr på. Det er selve oversættelsen fra c til
Object Pascal (Delphi 7), der er problemet.
Kaldet er kort nok:
OLT_APISTATUS OlFgMapFrame(
OLT_IMG_DEV_ID DeviceId,
OLT_FG_FRAME_ID FrameId,
LPOLT_FG_FRAME_INFO lpFrameInfo
);
Jeg ved fra anden, virkende, kode at OLT_IMG_DEV_ID og OLT_FG_FRAME_ID
blot er DWords, så inden problemer der. LPOLT_FG_FRAME_INFO er værre.
I første omgang har jeg oversat kaldet til
function OlFgMapFrame(DeviceId: DWord; FrameID: DWord; var lpFrameInfo:
OLT_FG_FRAME_INFO): DWord; StdCall;
Jeg skal så have konstrueret OLT_FG_FRAME_INFO. Til hjælp har jeg denne
struktur fra c-koden:
typedef struct olOLT_FG_FRAME_INFO
{
ULNG StructSize;
LPVOID BaseAddress;
ULNG Flags;
OLT_FG_DEV_MEM MemType;
USHRT Width;
USHRT Height;
USHRT BytesPerSample;
USHRT SamplesPerPixel;
USHRT HorizontalPitch;
USHRT VerticalPitch;
USHRT BitsPerSample;
OLT_FG_JUSTIFY_KEY BitJustification;
/* Specifies whether bits in pixel element are right or left justified
OLC_FG_JUSTIFY_RIGHT or OLC_FG_JUSTIFY_LEFT */
} OLT_FG_FRAME_INFO, *POLT_FG_FRAME_INFO,
FAR *LPOLT_FG_FRAME_INFO;
Jeg er meget i tvivl om hvordan jeg laver en Delphi-ækvivalent. Jeg
_gætter_ på at jeg skal lave en record, men hvad med sådan noget som
"Record field alignment"? Den skal vel ramme den tilsvarende struct fra
c, men hvordan gør jeg det? Lige nu er den sat til 8 bytes.
Jeg forestiller mig noget i stil med
OLT_FG_FRAME_INFO = record
StructSize: Longword;
BaseAddress: Pointer;
Flags: Longword;
MemType: OLT_FG_DEV_MEM;
Width: Word;
Height: Word;
BytesPerSample: Word;
SamplesPerPixel: Word;
HorizontalPitch: Word;
VerticalPitch: Word;
BitsperSample: Word;
BitJustification: OLT_FG_JUSTIFY;
end;
med
OLT_FG_DEV_MEM = (Dummy, OLC_FG_DEV_MEM_VOLATILE,
OLC_FG_DEV_MEM_NONVOLATILE );
og
OLT_FG_JUSTIFY = (OLT_FG_JUSTIFY_RIGHT, OLT_FG_JUSTIFY_LEFT);
Jeg får en exception om illegal access, når jeg prøver ovenstående, så
jeg har jo nok klokket i det et eller andet sted. Nogen hints?
| |
Uffe Kousgaard (02-12-2005)
| Kommentar Fra : Uffe Kousgaard |
Dato : 02-12-05 14:36 |
|
"Toke Eskildsen" <darkwing@daimi.au.dk> wrote in message
news:Xns971EE63E761D0tokeeskildsen@130.225.247.90...
> Jeg er meget i tvivl om hvordan jeg laver en Delphi-ækvivalent. Jeg
> _gætter_ på at jeg skal lave en record, men hvad med sådan noget som
> "Record field alignment"?
Brug "packed record"
Resten skal jeg ikke gøre mig klog på.
hilsen
Uffe
| |
Mogens Hansen (02-12-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 02-12-05 17:35 |
|
"Toke Eskildsen" <darkwing@daimi.au.dk> wrote in message
news:Xns971EE63E761D0tokeeskildsen@130.225.247.90...
[8<8<8<]
> Nogen hints?
1)
Brug Borland C++Builder i stedet for Borland Delphi, hvis der interfaces til
nævneværdige mængder C kode - så slipper du for mapnings problemer.
C++Builder er Delphi med C++ som programmeringssprog i stedet for Delphi
Language.
2)
Check at alignment i strukturen er rigtig.
Prøv eventuelt at få en lille stump C kode til at virke, og brug så en
debugger til at checke at de enkelte elementer ligger på de rigtige offset i
Delphi programmet.
3)
Kig på hvordan funktioner og datastrukturer mapper i Win32 API'et i C filen
Windows.h og tilsvarende i Pascal filen windows.pas
4)
Læs http://community.borland.com/article/0,1410,10281,0.html og
http://velthuis.homepage.t-online.de/articles/articles-convert.html
5)
Søg på Google efter HPPEMIT
Venlig hilsen
Mogens Hansen
| |
|
|