Article View: be.comp.programming
Article #4649Re: Delphi DLL en C toepassing
From: Matthijs Laan
Date: Sun, 20 Jul 2003 23:46
Date: Sun, 20 Jul 2003 23:46
137 lines
4264 bytes
4264 bytes
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:
<Xns93BF1244E5B5Amatthijsln@news.xs4all.nl>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-03!sn-xit-06!sn-xit-01!sn-xit-09!supernews.com!news.maxwell.syr.edu!transit.news.xs4all.nl!not-for-mailReferences:
<L1BSa.23002$F92.2229@afrodite.telenet-ops.be>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-20 16:46:24 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-03!sn-xit-06!sn-xit-01!sn-xit-09!supernews.com!news.maxwell.syr.edu!transit.news.xs4all.nl!not-for-mail Newsgroups: be.comp.programming,nl.comp.programmeren Subject: Re: Delphi DLL en C toepassing From: Matthijs Laan <matthijsln@nospam-remove.xs4all.nl> References: <L1BSa.23002$F92.2229@afrodite.telenet-ops.be> Message-ID: <Xns93BF1244E5B5Amatthijsln@news.xs4all.nl> User-Agent: Xnews/06.02.16 X-Face: ./Iyf!u(N\'up#=y6brL]rn2zIIdkg9_~rPFP]fx`}gz:c7gO~4:GIM+;uUU$@;mR7Asr9ROcI0[>m7XUqyw1WZl97#h2&FnqYQHg1Qcb>4ro/~i1ta~gtzQAha~R=<1XN:9?zCu}xoGWKfFc6DUph3.aa]tUvo6A#u*OQ^TN4?cA=q)V(BfV:yAVbPK_+mwZ7I<o0%#fH,u\E?atp(WF Date: 20 Jul 2003 23:46:09 GMT Lines: 137 NNTP-Posting-Date: 21 Jul 2003 01:46:09 CEST NNTP-Posting-Host: 80.127.246.159 X-Trace: 1058744769 news.xs4all.nl 49099 80.127.246.159:1145 X-Complaints-To: abuse@xs4all.nl