Delphi PChar zu C ++ const char *

7

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.

    
rptony 09.09.2009, 10:16
quelle

3 Antworten

17

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%     
Deltics 09.09.2009, 11:36
quelle
4

Ist char in beiden Compilern gleich groß? Wenn Sie D2009 / D2010 verwenden, ist char jetzt 16-Bit.

    
IanH 09.09.2009 11:03
quelle
3

Wenn ich richtig verstehe, sollte Ihr Funktionsprototyp ebenfalls stdcall sein.

%Vor%

ps. Delphi-Zeichenfolgen sind bereits nullterminiert.

    
utku_karatas 09.09.2009 10:21
quelle

Tags und Links