🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #4649

Re: Delphi DLL en C toepassing

#4649
From: Matthijs Laan
Date: Sun, 20 Jul 2003 23:46
137 lines
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-mail
References: <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