AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

c DLL char++ übersetzen

Ein Thema von mfoerste · begonnen am 17. Sep 2019 · letzter Beitrag vom 18. Okt 2019
Antwort Antwort
Seite 1 von 3  1 23   
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
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: c DLL char++ übersetzen

  Alt 17. Sep 2019, 11:18
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
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: c DLL char++ übersetzen

  Alt 17. Sep 2019, 11:33
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: c DLL char++ übersetzen

  Alt 17. Sep 2019, 11:51
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
Heiko
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#5

AW: c DLL char++ übersetzen

  Alt 17. Sep 2019, 11:56
Ü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;

Geändert von samso (17. Sep 2019 um 12:00 Uhr) Grund: msgLength ist long int => Integer und Kopierfehler
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#6

AW: c DLL char++ übersetzen

  Alt 17. Sep 2019, 12:12
Wie es scheint geben alle TSEs solch eine Grütze aus.
Damit ich nicht dumm sterben muss: Was ist ein TSE?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: c DLL char++ übersetzen

  Alt 17. Sep 2019, 12:22
TSE = Technische Sicherheitseinrichtung, dient zur digitalen Signatur von Kassenvorgängen (sehr verkürzt ausgedrückt).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mfoerste

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

AW: c DLL char++ übersetzen

  Alt 17. Sep 2019, 12:48
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: c DLL char++ übersetzen

  Alt 17. Sep 2019, 12:54
Hast Du #5 einmal versucht?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mfoerste

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

AW: c DLL char++ übersetzen

  Alt 17. Sep 2019, 12:56
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

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 14:03 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