Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL Delphi 10.1 Definition von char* (https://www.delphipraxis.net/192461-dll-delphi-10-1-definition-von-char%2A.html)

stalkingwolf 20. Apr 2017 13:01

DLL Delphi 10.1 Definition von char*
 
Hallo zusammen,

ich habe eine kurze Frage, welche ca so schon in dem asignRKCOM DLL Thread gestellt wurde.

ich habe Funktionen aus einer DLL. Beispiel:
Code:
long test(char* buffer, long *buffersize);
long test2(char* bufferVontest);
Diese habe ich dann als Delphi Funktion definiert mit
Code:
function test(buffer:pansichar;buffersize:plongint):long; stdcall; external 'test.dll';
function test2(bufferVontest:pansichar):long; stdcall; external 'test.dll';
Ich rufe diese auf mit:
Code:
var
b:pansichar;
l:plongint;

s:string;

begin
b  := nil;
l  := AllocMem(1) ;
test(b,l); // <- Funktion gibt bei b = nil in l die Länge zurück. Dies ist IMMMER z.b 20 Zeichen
b  := PAnsiChar(AllocMem(l^ +1 )); // Hier Größe von b durch die Länge in l definieren
test(b,l);

s:=strpas(b);

test2(pansichar(s)); // Ergibt einen Fehler das s eine falsche Länge hat
test2(b); // Ergibt OK und keinen Fehler


end;
Mein Problem an der ganzen Sache ist, das ich danach eine zweite Funktion aus der DLL habe, welche als Argument das Ergebnis aus der Variable b mitgegeben bekommt.
Gebe ich dieser Funktion dann das Resultat meiner Funktion mytest mit pansichar(mytest) mit, dann lehnt die Funktion dies ab da die Länge nicht stimmt. Die Länge soll z.b immer 20 Zeichen sein.
Übergebe ich aber hingegen direkt die Variable b ( z.b durch direkten Aufruf dahinter ), dann ist das Argument in Ordnung.

Wo ist hier mein Denk/Ansatzfehler.

Zacherl 20. Apr 2017 13:18

AW: DLL Delphi 10.1 Definition von char*
 
Dein ganzer Code ist ziemlich umständlich. Normalerweise macht man das so:
Delphi-Quellcode:
var
  Len: LongInt;
  Buf: array of AnsiChar;
begin
  Test(nil, @Len);
  SetLength(Buf, Len);
  FillChar(Buf[0], SizeOf(Buf), #0); // -> je nachdem, ob die Dll-Funktion selbstständig nullterminiert, oder nicht
  Test(@Buf[0], @Len);
Zum Fehler bei
Delphi-Quellcode:
test2
führt, dass du deine Rückgabe mit
Delphi-Quellcode:
StrPas
einem normalen String zuweist. In deiner Delphi-Version sind Strings aber Unicode und nicht ASCII.

stalkingwolf 20. Apr 2017 13:41

AW: DLL Delphi 10.1 Definition von char*
 
Verstehe. Klingt logisch.
Ich habe das letzte mal auf DLL Dateien mit Delphi 6 zugegriffen und da gab es kein Unicode. :lol:

d.h ich kann auch per
Code:
pansichar(ansistring(s))
das Argument weitergeben.
Gerade getestet und es funktioniert.

Danke für die schnelle Antwort.

himitsu 20. Apr 2017 13:44

AW: DLL Delphi 10.1 Definition von char*
 
Zitat:

Delphi-Quellcode:
test2(pansichar(s)); // Ergibt einen Fehler das s eine falsche Länge hat

Zitat:

Zitat von Zacherl (Beitrag 1368420)
Zum Fehler bei
Delphi-Quellcode:
test2
führt, dass du deine Rückgabe mit
Delphi-Quellcode:
StrPas
einem normalen String zuweist. In deiner Delphi-Version sind Strings aber Unicode und nicht ASCII.

Ergibt auch eine Compiler-Warnung, welche du scheinbar nicht beachtest.

Und grundsätlich kann man erstmal CHAR im C eher mit einem BYTE in Delphi gleichsetzen.
Gut, eigentlich ist CHAR ein ShortInt und UCHAR ein Byte (U von Unsignet und nicht von Unicode)

Der Typ Char in Delphi ist ein compilerabhängiger Alias, welcher für AnsiChar oder WideChar steht.

stalkingwolf 20. Apr 2017 14:14

AW: DLL Delphi 10.1 Definition von char*
 
Zitat:

Zitat von himitsu (Beitrag 1368428)
Zitat:

Delphi-Quellcode:
test2(pansichar(s)); // Ergibt einen Fehler das s eine falsche Länge hat

Zitat:

Zitat von Zacherl (Beitrag 1368420)
Zum Fehler bei
Delphi-Quellcode:
test2
führt, dass du deine Rückgabe mit
Delphi-Quellcode:
StrPas
einem normalen String zuweist. In deiner Delphi-Version sind Strings aber Unicode und nicht ASCII.

Ergibt auch eine Compiler-Warnung, welche du scheinbar nicht beachtest.

Eher untergegangen, weil ich noch andere Warnings habe. Ich habe aber auch explizit nicht danach geschaut.
Gerade mal alles aufgeräumt und auch System.AnsiStrings für strpas eingebunden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 Uhr.

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