Article View: be.comp.programming
Article #4650Re: Delphi DLL en C toepassing
From: Ivan Van den Bossche
Date: Mon, 21 Jul 2003 09:00
Date: Mon, 21 Jul 2003 09:00
147 lines
4864 bytes
4864 bytes
Hi,
Hartelijk dank voor jouw hulp. Het is gelukt!
Groeten,
Ivan
"Matthijs Laan" <matthijsln@nospam-remove.xs4all.nl> wrote in message
news:Xns93BF1244E5B5Amatthijsln@news.xs4all.nl...
> Ivan Van den Bossche wrote:
>
> > Ik heb een DLL geschreven in Delphi. Deze DLL wil ik gebruiken in een
> > C toepassing. Een van de functies in de DLL moet een array van
> > strings teruggeven als resultaat. Weet er iemand hoe je dit moet doen
> > zodat deze functie vanuit een C toepassing aangesproken kan worden?
> > Of kan er iemand een goede website geven of een goed voorbeeld?
>
> Zoals in de standaard waarschuwing staat die Delphi in een nieuw DLL-
> project zet, kan je geen Delphi-strings gebruiken in de interface, dus je
> zult het met PChar's moeten doen.
>
> Een ander issue is hoe je memory management gaat doen: alloceert en freet
> de code in de DLL het geheugen of de code die de DLL aanroept?
>
> Wat nu volgt is een voorbeeld waarbij de DLL het geheugen alloct en freet.
> Dit werkt met Delphi 5 en Microsoft Visual C++ 6. Als je een andere C
> compiler gebruikt moet je de import library misschien op een andere manier
> maken.
>
> Het maken van alles gaat als volgt:
>
> ; delphi_dll.dll maken (Delphi 5)
> dcc32 delphi_dll.dpr
>
> ; C import library maken (Visual C++)
> lib /def:delphi_dll.def
>
> ; C prog maken (Visual C++)
> cl call_delphi_dll.c delphi_dll.lib
>
> Als je dan "call_delphi_dll.exe" runt, dan moet de output zijn:
>
> Array size: 2
> Array item 0: foo
> Array item 1: foobar
> Array freed
>
> Nu de files:
>
> --- 8< --- delphi_dll.dpr --- 8< ---
>
> library delphi_dll;
>
> type
> PInteger = ^Integer;
>
> PPCharArray = ^TPCharArray;
> TPCharArray = array[0..High(Integer) div SizeOf(PChar) - 1] of PChar;
>
> { Geeft als resultaat een array met PChars. In Count wordt de lengte van
de
> array gezet.
>
> FIXME EOutOfMemory exception handlen
> }
> function GetStringArray(Count: PInteger): PPCharArray; cdecl;
> var
> s1, s2: string;
> begin
> s1 := 'foo';
> s2 := 'foobar';
>
> GetMem(Result, 2 * SizeOf(PChar));
> Count^ := 2;
>
> { Ook ruimte voor nul-terminator }
> GetMem(Result^[0], Length(s1) + 1);
>
> { Een Delphi-string heeft altijd een nul-karakter na het laatste
> karakter }
> Move(s1[1], Result^[0]^, Length(s1) + 1);
>
> GetMem(Result^[1], Length(s2) + 1);
> Move(s2[1], Result^[1]^, Length(s2) + 1);
> end;
>
> procedure FreeStringArray(p: PPCharArray; Count: integer); cdecl;
> var
> i: integer;
> begin
> for i := 0 to Count - 1 do begin
> FreeMem(p^[i]);
> end;
> FreeMem(p);
> end;
>
> exports
> GetStringArray,
> FreeStringArray;
>
> begin
> end.
>
> --- 8< --- delphi_dll.h --- 8< ---
>
> #ifndef __DELPHI_DLL__
> #define __DELPHI_DLL__
>
> char **GetStringArray(int *Count);
> void FreeStringArray(char **p, int Count);
>
> #endif/*__DLL_1__*/
>
> --- 8< --- delphi_dll.def --- 8< ---
>
> EXPORTS
> GetStringArray=_GetStringArray
> FreeStringArray=_FreeStringArray
>
> --- 8< --- call_delphi_dll.c --- 8< ---
>
> #include "delphi_dll.h"
>
> int main() {
> int i, count;
> char **array;
>
> array = GetStringArray(&count);
>
> printf("Array size: %d\n", count);
>
> for(i=0;i<count;i++) {
> printf("Array item %d: %s\n", i, array[i]);
> }
>
> FreeStringArray(array, count);
>
> printf("Array freed\n");
>
> return 0;
> }
>
> --- 8< ---
>
> mvg,
>
> Matthijs
Technical Details
Message-ID:
<0ZNSa.23961$F92.2457@afrodite.telenet-ops.be>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-04!sn-xit-01!sn-xit-08!supernews.com!news.tele.dk!news.tele.dk!small.news.tele.dk!newsfeed.multikabel.nl!newsfeed.kabelfoon.nl!212.113.2.136.MISMATCH!newsfeed.london1.eu.level3.net!level3eu!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mailReferences:
<L1BSa.23002$F92.2229@afrodite.telenet-ops.be> <Xns93BF1244E5B5Amatthijsln@news.xs4all.nl>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: 107324,59502ba6c0456e50 X-Google-Attributes: gid107324,public X-Google-Thread: fcea4,59502ba6c0456e50 X-Google-Attributes: gidfcea4,public X-Google-ArrivalTime: 2003-07-21 02:00:47 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-04!sn-xit-01!sn-xit-08!supernews.com!news.tele.dk!news.tele.dk!small.news.tele.dk!newsfeed.multikabel.nl!newsfeed.kabelfoon.nl!212.113.2.136.MISMATCH!newsfeed.london1.eu.level3.net!level3eu!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail From: "Ivan Van den Bossche" <ivan.van.den.bossche@pandora.be> Newsgroups: be.comp.programming,nl.comp.programmeren References: <L1BSa.23002$F92.2229@afrodite.telenet-ops.be> <Xns93BF1244E5B5Amatthijsln@news.xs4all.nl> Subject: Re: Delphi DLL en C toepassing Lines: 149 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1106 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 Message-ID: <0ZNSa.23961$F92.2457@afrodite.telenet-ops.be> Date: Mon, 21 Jul 2003 09:00:44 GMT NNTP-Posting-Host: 213.119.154.66 X-Complaints-To: abuse@telenet.be X-Trace: afrodite.telenet-ops.be 1058778044 213.119.154.66 (Mon, 21 Jul 2003 11:00:44 MET DST) NNTP-Posting-Date: Mon, 21 Jul 2003 11:00:44 MET DST Organization: Telenet Internet