Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   c DLL char++ übersetzen (https://www.delphipraxis.net/201991-c-dll-char-uebersetzen.html)

mfoerste 17. Sep 2019 11:04

c DLL char++ übersetzen
 
Hallo,
ich kenne mich leider nicht gut mit Zeigern aus und muss jetzt eine fremde dll einbinden, die viel mit Zeigern arbeitet. Funktionen ohne Zeiger vom Typ char** konnte ich erfolgreich einbinden, aber mit bekomme ich es einfach nicht übersetzt.

Nach vielen Stunden des vergebenen Suchens möchte nun hier um Hilfe bitten.

Die Dll (in c geschrieben) hat eine einfache function, die nur eine LogMessage und deren Länge zurückgibt. Die Definition ist laut Hersteller wie folgt:
Code:
short int readLogMessage(unsigned char **logMessage,
                         unsigned long int *logMessageLength);
Ich habe u. a. versucht, dies so zu übersetzen:
Code:
function readLogMessage(logMessage:ppAnsiChar;
                        logMessageLength:PWORD):integer;stdcall;external 'fremdedll.dll';
Um an die Logmessage zu kommen habe ich mir folgenden Code überlegt, der leider nicht wirklich funktioniert:
Code:
type
TArrayOfAnsiChar = array of AnsiChar;
pArrayOfAnsiChar = ^TArrayOfAnsiChar;

var
msg: ppAnsiChar;
ergebnis,i: integer;
pmsg : pArrayOfAnsiChar;
msgLength: pWord;
str : string;

begin
  new(msg);
  new(pmsg);
  new(msgLength);
  ergebnis := readLogMessage(msg,msgLength);
  memo1.lines.add(inttostr(msgLength^));
  pmsg := pointer(msg);
  str := '';
  for i := 0 to msgLength^-1  do
  begin
    str := str + pmsg^[i];
  end;
  ShowMessage(str);
end;
msgLength^ gibt 305 zurück, was laut Hersteller der dll wohl realistisch sein soll. str hat folgenden Inhalt:

'0‚'#1'-'#2#1#2#6#9#4#0#$7F#0#7#3#7#1#1'€'#$10'StartTransa ction'#$0081#$14'a'#0's'#0'i'#0'g'#0'n'#0't'#0's'# 0'e'#0'_'#0'd'#0'‚YB'#0'e'#0'l'#0'e'#0'g'#0'^'#0'7 '#0'5'#0'.'#0'3'#0'3'#0'_'#0'7'#0'.'#0'9'#0'9'#0'_ '#0'0'#0'.'#0'0'#0'0'#0'_'#0'0'#0'.'#0'0'#0'0'#0'_ '#0'0'#0'.'#0'0'#0'0'#0'^'#0'1'#0'0'#0'.'#0'0'#0'0 '#0':'#0'B'#0'a'#0'r'#0'_'#0'5'#0'.'#0'0ƒ'#$E'K'#0 'a'#0's'#0's'#0'e'#0'n'#0'b'#0'…'#1' '#4' ÎŒ6,qPò³'#$19'Y½ZDHâo'#$13'ŠÍçBNhéh‹m¼Öœ™\0'#$A#6# 8'*†HÎ='#4#3#2#2#1'!'#$17#$D'190914143703Z'#4'G0E' #2'!'#0#$008F'øA$™I'#$0081')Ó–8'#$1D'šáÉ”¯oEÛâYEÛÓ 9#B[/ŒN'#2' *~§ƒs#'#5'(Øp\¬¢ívO'#$14'¥@ÉtÚÉÄFËMH_u¨¬'

Teilweise sieht es wie nullterminierte Strings aus.
Jemand eine Idee wie es richtig funktioniert?

KodeZwerg 17. Sep 2019 11:18

AW: c DLL char++ übersetzen
 
Hi, ich kenne Deine Bibliothek leider nicht aber ich nutz bei solch einen Aufruf (unsigned char) = Byte anstelle von AnsiChar.

Dein output sieht eher nach einem WideString anstelle AnsiString aus.... hmmmm

DeddyH 17. Sep 2019 11:33

AW: c DLL char++ übersetzen
 
Wie es scheint geben alle TSEs solch eine Grütze aus. Mir konnte bislang leider auch noch niemand sagen, ob das so stimmt, oder zumindest einen in C ausgelesenen Vergleichswert zukommen lassen. Ansonsten schau einmal hier: https://www.delphipraxis.net/201926-...ersetzung.html

hoika 17. Sep 2019 11:51

AW: c DLL char++ übersetzen
 
Hallo,
müßte das nicht so aussehen?

char ** P
var p: PAnsiChar

Also Zeiger auf einen Zeiger.

Siehe auch hier
https://stackoverflow.com/questions/...char-to-delphi

samso 17. Sep 2019 11:56

AW: c DLL char++ übersetzen
 
Üblicherweise sind solche Zeiger auf Zeiger ein Hinweis darauf, dass hier die DLL eine Variable beschreiben möchte. Deshalb würde ich schon readLogMessage anders formulieren.

Vielleicht geht es so:

Delphi-Quellcode:
function readLogMessage(var logMessage: pAnsiChar;
                        var logMessageLength:Integer):integer;stdcall;external 'fremdedll.dll';
und dann

Delphi-Quellcode:
var
 msg: pAnsiChar;
 ergebnis: integer;
 msgLength: integer;
 str : Ansistring;

begin
  ergebnis := readLogMessage(msg,msgLength);
  memo1.lines.add(inttostr(msgLength));
  SetLength(str, msgLength);
  AnsiStrings.StrLCopy(PAnsiChar(str), msg, msgLength);
  ShowMessage(String(str));
end;

samso 17. Sep 2019 12:12

AW: c DLL char++ übersetzen
 
Zitat:

Zitat von DeddyH (Beitrag 1446597)
Wie es scheint geben alle TSEs solch eine Grütze aus.

Damit ich nicht dumm sterben muss: Was ist ein TSE?

DeddyH 17. Sep 2019 12:22

AW: c DLL char++ übersetzen
 
TSE = Technische Sicherheitseinrichtung, dient zur digitalen Signatur von Kassenvorgängen (sehr verkürzt ausgedrückt).

mfoerste 17. Sep 2019 12:48

AW: c DLL char++ übersetzen
 
Der Hersteller gab mir noch folgenden Hinweis:

readLogMessage wird die Speicheradresse eines Zeigers auf ein array von chars und die Speicheradresse eines long integers übergeben. Nach dem erfolgreichen Aufruf der Funktion, Zeigt der übergebene Zeiger auf ein array von chars und logMessageLength enthält die länge dieses arrays.

DeddyH 17. Sep 2019 12:54

AW: c DLL char++ übersetzen
 
Hast Du #5 einmal versucht?

mfoerste 17. Sep 2019 12:56

AW: c DLL char++ übersetzen
 
Immer wenn ich mit einem Zitat antworte kommt die Meldung, dass diese erst durch einen Mod freigeschaltet werden muss.

Also ohne Zitat:
ja, ich habe #5 versucht und erhielt folgendes Ergebnis:

Name Wert
str '0‚'#1'-'#2#1#2#6#9#4#0#0'N'#0'_'#0'I'#0'N'#0'F'#0'O'#0#0# 0#0#0'½'#4'ïþ'#0#0#1#0#$A#0#6#0'd'#1'ºG'#0#0#$A#0' d'#1'ºG?'#0#0#0#0#0#0#0#4#0#4#0#2#0#0#0#0#0#0#0#0# 0#0#0#0#0#0#0'ö'#2#0#0#1#0'S'#0't'#0'r'#0'i'#0'n'# 0'g'#0'F'#0'i'#0'l'#0'e'#0'I'#0'n'#0'f'#0'o'#0#0#0 'Ò'#2#0#0#1#0'0'#0'4'#0'0'#0'7'#0'0'#0'4'#0'B'#0'0 '#0#0#0'L'#0#$16#0#1#0'C'#0'o'#0'm'#0'p'#0'a'#0'n' #0'y'#0'N'#0'a'#0'm'#0'e'#0#0#0#0#0'M'#0'i'#0'c'#0 'r'#0'o'#0's'#0'o'#0'f'#0't'#0' '#0'C'#0'o'#0'r'#0'p'#0'o'#0'r'#0'a'#0't'#0'i'#0'o '#0'n'#0#0#0'd'#0#$1E#0#1#0'F'#0'i'#0'l'#0'e'#0'D' #0'e'#0's'#0'c'#0'r'#0'i'#0'p'#0't'#0'i'#0'o'#0'n' #0#0#0#0#0'B'#0'i'#0'b'#0'l'#0'i'#0'o'#0't'#0'h'#0 'e'#0'k'#0' '#0'f'#0'ü'#0'r'#0' '#0'S'#0't'#0'e'#0'u'#0'e'#0'r'#0'e'#0'l'#0'e'#0#0


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr.
Seite 1 von 3  1 23      

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