Ich versuche, eine C ++ - DLL aus einem nativen Programm zu verwenden. Ich folge dem virtuellen Methodenszenario, wie hier erklärt hier
Nehmen wir an, meine C ++ - Funktionssignatur hat die Form
%Vor%Und die entsprechende Delphi-Signatur ist
%Vor%Und irgendwo im Delphi-Programm kann ich
anrufen %Vor%Das Steuerelement kommt in die DLL, aber die formalen Parameter szIp und szPort erhalten nur das erste Zeichen der IP und des Ports, die ich vom Delphi-Programm übergeben habe.
Ich verstehe, dass es mit null zu tun hat, die Zeichenfolge in Delphi richtig zu beenden. Also habe ich folgendes auch versucht.
%Vor% Das funktioniert auch nicht. Wenn ich Writeln
pzIp
und pzPort
bekomme ich seltsame Ergebnisse.
Vergessen Sie zu sagen, dass alle Member-Funktionen aus der C ++ - DLL mit __stdcall
kompiliert und korrekt exportiert werden.
In Delphi 2010 (und Delphi 2009) ist der Typ "char" tatsächlich ein WIDEChar - also 16 Bit breit. Wenn Sie also Ihre C ++ - Funktion aufrufen, wenn CHAR 8 Bit breit ist (also "ANSI" statt UNICODE), wird der Eingabeparameter falsch interpretiert.
z.B. Wenn Sie die Zeichenfolge 'ABC' # 0 übergeben (ich zeige explizit den Null-Terminator, dies ist jedoch nur ein impliziter Teil einer Zeichenfolge in Delphi und muss nicht extra hinzugefügt werden), übergibt dies a Zeiger auf eine 8 Byte Sequenz, NICHT 4 Bytes!
Aber da die 3 Zeichen in Ihrer Zeichenfolge nur 8-Bit-Codepunktwerte haben (in Unicode-Begriffen bedeutet dies, dass der C ++ - Code "sieht", ist eine Zeichenfolge, die wie folgt aussieht:
%Vor%Das würde erklären, warum Ihr C ++ - Code anscheinend nur das erste Zeichen der Zeichenfolge erhält - er sieht # 0 im zweiten Byte des ersten Zeichens und angenommen, dass es der Null-Terminator für die gesamte Zeichenfolge ist.
Sie müssen entweder Ihren C ++ - Code ändern, um Zeiger auf WideChar Zeichenfolgen korrekt zu empfangen ODER die Funktionssignatur in Delphi ändern und Ihre Zeichenfolgen im Delphi-Code in ANSIString konvertieren vor übergibt diese an die C ++ - Funktion:
Überarbeitete Funktionssignatur:
%Vor%und die entsprechende "Lange Hand", die die Umwandlung von Zeichenfolgen in ANSIString vor dem Aufruf der Funktion anzeigt - der Compiler kann dies für Sie erledigen, aber Sie könnten es hilfreich finden, dies in Ihrem Code zu verdeutlichen anstatt sich auf "Compiler-Magie" zu verlassen:
%Vor%Wenn ich richtig verstehe, sollte Ihr Funktionsprototyp ebenfalls stdcall sein.
%Vor%ps. Delphi-Zeichenfolgen sind bereits nullterminiert.