Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi C++ DLL aufrauf nach Delphi übersetzten (https://www.delphipraxis.net/77091-c-dll-aufrauf-nach-delphi-uebersetzten.html)

ueding 14. Sep 2006 14:39


C++ DLL aufrauf nach Delphi übersetzten
 
Hallo

ich muss ein C++ DLL in Delpi einbinden, habe aber leider ein paar Probleme damit
hier der c++ DLL Aufruf
Delphi-Quellcode:
_DECL int __stdcall ListAllNames(char* NamenListe, int nBufferSize);
wie muss die declaration aussehen und
wie gestallte ich den Aufruf der DLL in Delphi.

besten Dank


Gregor

mkinzler 14. Sep 2006 14:50

Re: C++ DLL aufrauf nach Delphi übersetzten
 
Delphi-Quellcode:
function ListAllNames(NamenListe: Pchar; nBufferSize: Integer): Integer; stdcall; external 'DLLName' name 'ListAllNames'

ueding 14. Sep 2006 15:08

Re: C++ DLL aufrauf nach Delphi übersetzten
 
Danke erstmal

stellt sich die zweite Frage wie rufe ich die Function auf
habe mir das so vorgestellt, geht aber leider nicht

Delphi-Quellcode:
procedure EINLESEN.Button5Click(Sender: TObject);
var
p : pchar;
i : integer;


s : String;

begin
i := 0;
p := @s;
ListAllNames (p,i)  ;

end;
wo mache ich den Fehler

danke

ste_ett 14. Sep 2006 15:18

Re: C++ DLL aufrauf nach Delphi übersetzten
 
Code:
procedure EINLESEN.Button5Click(Sender: TObject);
var
i : integer;
s : String;
begin
  i := 0;
  ListAllNames(PChar(s),i);
end;

ueding 14. Sep 2006 15:29

Re: C++ DLL aufrauf nach Delphi übersetzten
 
funktioniert leider nicht,
wenn ich das so mache dann bekomme ich die Fehlermeldumg
Delphi-Quellcode:
[Fehler] EINLESEN.pas(107): E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
die DLL soll mir eine liste zurück geben, und in nBufferzise soll die anzahl der zurück gegebenen zeichen stehen.

Gregor

_rEdoX 14. Sep 2006 15:37

Re: C++ DLL aufrauf nach Delphi übersetzten
 
Delphi-Quellcode:
var
i : integer;
pc : PChar;
begin
  i := 12345;
  ListAllNames(pc,i);
end;
so sollte es eigentlich rennen.

mkinzler 14. Sep 2006 15:39

Re: C++ DLL aufrauf nach Delphi übersetzten
 
Versuch mal
Delphi-Quellcode:
ListAllNames (p,i);
s := p;

SirThornberry 14. Sep 2006 15:44

Re: C++ DLL aufrauf nach Delphi übersetzten
 
Zitat:

Zitat von ueding
funktioniert leider nicht,
wenn ich das so mache dann bekomme ich die Fehlermeldumg
Delphi-Quellcode:
[Fehler] EINLESEN.pas(107): E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
die DLL soll mir eine liste zurück geben, und in nBufferzise soll die anzahl der zurück gegebenen zeichen stehen.

Gregor

in nBuffersize wirst du niemals die anzahl der zurück gegebenen Zeischen finden da nBuffersize nicht als Var-Parameter übergeben wird und somit auch nicht von der DLL geändert werden kann.
So wie die Funktion aussieht übergist du als ersten Parameter den Buffer (der Speicher sollte schon reserviert sein) und nBufferSize gibt an wie groß der Buffer ist (wieviel Speicher du reserviert hast). Der Rückgabewert der Funktion gibt an wieviel Speicher gebraucht wird.

ueding 14. Sep 2006 19:55

Re: C++ DLL aufrauf nach Delphi übersetzten
 
Hallo
habe noch ein wenig geforscht
die DLL gibt bei NamenListe eine Liste von Null-terminierten Strings.
Buffersize gibt wie viel Speicher ich bereit gestellt habe.
Rückgabebewert der Function ist die Anzahl der tatsächlich benötigten Bytes.

Habe nachstehenden Code ausprobiert geht aber auch nicht.
Delphi-Quellcode:
procedure EINLESEN.Button5Click(Sender: TObject);
var
NameIntern : array [0..15] of Char;
i : integer;
P : PCHAR;
s : String;
anzahl : integer;



begin
p := nil;

i := 16;
p :=@nameintern;


anzahl := ListAllNames  ( p,i)  ;

end;
wenn noch mal jemend helfen könnte ?

Danke

Gregor

Der_Unwissende 15. Sep 2006 11:28

Re: C++ DLL aufrauf nach Delphi übersetzten
 
Zitat:

Zitat von ueding
Hallo
die DLL gibt bei NamenListe eine Liste von Null-terminierten Strings.
Buffersize gibt wie viel Speicher ich bereit gestellt habe.
Rückgabebewert der Function ist die Anzahl der tatsächlich benötigten Bytes.

Dann nutz dass doch einfach schon mal aus:
Delphi-Quellcode:
procedure EINLESEN.Button5Click(Sender: TObject);
var
nameList : Array of Char;
size : integer;
begin
  // benötigte Größe ermitteln
  size := ListAllNames(nil, 0);

  // array anlegen
  setLength(nameList, size);
  listAllNames(@nameList[0], size);
 
  ...
end;
Gruß Der Unwissende


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz