/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
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



Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste