🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #4650

Re: Delphi DLL en C toepassing

#4650
From: Ivan Van den Bossche
Date: Mon, 21 Jul 2003 09:00
147 lines
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-mail
References: <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