![]() |
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:
Ich habe u. a. versucht, dies so zu übersetzen:
short int readLogMessage(unsigned char **logMessage,
unsigned long int *logMessageLength);
Code:
Um an die Logmessage zu kommen habe ich mir folgenden Code überlegt, der leider nicht wirklich funktioniert:
function readLogMessage(logMessage:ppAnsiChar;
logMessageLength:PWORD):integer;stdcall;external 'fremdedll.dll';
Code:
msgLength^ gibt 305 zurück, was laut Hersteller der dll wohl realistisch sein soll. str hat folgenden Inhalt:
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; '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? |
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 |
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:
![]() |
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 ![]() |
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:
und dann
function readLogMessage(var logMessage: pAnsiChar;
var logMessageLength:Integer):integer;stdcall;external 'fremdedll.dll';
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; |
AW: c DLL char++ übersetzen
Zitat:
|
AW: c DLL char++ übersetzen
TSE = Technische Sicherheitseinrichtung, dient zur digitalen Signatur von Kassenvorgängen (sehr verkürzt ausgedrückt).
|
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. |
AW: c DLL char++ übersetzen
Hast Du
![]() |
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 21:04 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 by Thomas Breitkreuz