Einzelnen Beitrag anzeigen

mfoerste

Registriert seit: 26. Sep 2005
10 Beiträge
 
Delphi 10.3 Rio
 
#1

c DLL char++ übersetzen

  Alt 17. Sep 2019, 11:04
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?
  Mit Zitat antworten Zitat