AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein DLL Delphi 10.1 Definition von char*

DLL Delphi 10.1 Definition von char*

Ein Thema von stalkingwolf · begonnen am 20. Apr 2017 · letzter Beitrag vom 20. Apr 2017
Antwort Antwort
stalkingwolf

Registriert seit: 6. Mai 2011
516 Beiträge
 
#1

DLL Delphi 10.1 Definition von char*

  Alt 20. Apr 2017, 14:01
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.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: DLL Delphi 10.1 Definition von char*

  Alt 20. Apr 2017, 14:18
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 test2 führt, dass du deine Rückgabe mit StrPas einem normalen String zuweist. In deiner Delphi-Version sind Strings aber Unicode und nicht ASCII.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (20. Apr 2017 um 20:45 Uhr)
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
516 Beiträge
 
#3

AW: DLL Delphi 10.1 Definition von char*

  Alt 20. Apr 2017, 14:41
Verstehe. Klingt logisch.
Ich habe das letzte mal auf DLL Dateien mit Delphi 6 zugegriffen und da gab es kein Unicode.

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

Danke für die schnelle Antwort.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#4

AW: DLL Delphi 10.1 Definition von char*

  Alt 20. Apr 2017, 14:44
Zitat:
test2(pansichar(s)); // Ergibt einen Fehler das s eine falsche Länge hat
Zum Fehler bei test2 führt, dass du deine Rückgabe mit 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
516 Beiträge
 
#5

AW: DLL Delphi 10.1 Definition von char*

  Alt 20. Apr 2017, 15:14
Zitat:
test2(pansichar(s)); // Ergibt einen Fehler das s eine falsche Länge hat
Zum Fehler bei test2 führt, dass du deine Rückgabe mit 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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 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