2016-05-04 1 views
2

Ich rufe von Delphi eine C extern Funktion in einer Visual Studio kompilierten DLL auf. Die DLL-Methode wiederum ruft eine C++ - Methode auf, die als Argument einen C++ - String-Typ verwendet. Die Zeichenfolge am Delphi-Ende ist UTF-8-codiert (ohne BOM). Ich muss sicherstellen, dass die C++ - Methode, die den String-Typ übernimmt, die UTF-8-codierte Zeichenfolge erhält.Wie UTF-8-Zeichenfolge von Delphi an eine DLL C Extern-Funktion übergeben?

Ich kann den DLL-Quellcode ändern. Meine Frage:

Meine UTF-8-Zeichenfolge auf der Delphi-Seite ist vom Typ Zeichenfolge. Welchen Typ sollte die C extern Methode annehmen? PChar, PWideChar? und wie konvertiere ich das in einen C++ - String-Typ?

Hinweis: Ich kann die UTF-8-Zeichenfolge nicht zuerst in eine AnsiString konvertieren, da die Codierung einige griechische Buchstaben speichert, die beibehalten werden müssen. Das C++ - Ende erstellt eine Kopie der Delphi-Zeichenkette und behandelt die Entsorgung von allokiertem Speicher.

Delphi Ende (Mit XE6):

mystr : string; 

callCExternMethod (mystr) // cast to what? 

C++ End (Verwenden von VS 2013):

void callCExternMethod (????? mystr) { 

    // convert mystr to C++ string type 

    callCPlusPlusMethod (takes C++ string type) 
} 
+0

Sicher wurde diese Frage schon 100-mal gestellt ..... hast du versucht zu googeln? Jedes Mal, wenn Sie eine Windows-Funktion aufrufen, die Text verwendet, machen Sie genau das. – Johan

+1

PansiChar auf der Delphi-Seite. const char * auf der C++ Seite. Sie müssen vor dem Aufruf der Funktion ortf8 als null terminiert codieren. Die RTL hat Funktionen dafür. Versuchen Sie zu suchen. –

+0

Obligatorisch: http://rvelthuis.de/articles/articles-pchars.html – Johan

Antwort

6

Auf der Delphi Seite der Parameter PAnsiChar welche sie so übergeben: PAnsiChar(Utf8String(str)).

Auf der C++ Seite erhalten Sie den Parameter als const char*.

Offensichtlich müssen Sie sicherstellen, dass die Aufrufkonvention übereinstimmt.

+0

Das hat funktioniert. Ich danke dir für die Antwort. Wenn ich die Antwort kenne, kann ich nun sehen, dass es ähnliche Antworten gibt, zB http://stackoverflow.com/questions/21867113/how-to-use-unicode-from-delphi-in-c-dll, die aus irgendeinem Grund nicht aufgetaucht sind auf meiner Suche. Ich entschuldige mich dafür, dass ich die Zeit des Responders unnötig aufgebraucht habe. Bitte löschen Sie die Frage, wenn sie überflüssig ist. – rhody

+0

In Delphi 2009+ ist 'UTF8Encode()' veraltet, verwenden Sie stattdessen 'UTF8String':' PAnsiChar (UTF8String (str)) ', oder deklarieren Sie einfach' str' als 'UTF8String' und beginnen Sie mit der Schreibweise -is: 'PAnsiChar (str)'. –

+0

@RemyLebeau UTF8String wurde in "nex gen" verboten Delphi für LLVM –

1

wäre eine weitere Möglichkeit, die UTF8String Typ zu verwenden sein:

mystr : string; 
u8: UTF8String; 

u8 := UTF8String(mystr); 
callCExternMethod(PAnsiChar(u8)); 

Hinweis: Die UTF8String Typ für den Einsatz auf mobilen Plattformen in Delphi XE5 bis 10,0 Seattle nicht verfügbar ist, wenn Sie einen Patch verwenden, um es zu aktivieren:

http://andy.jgknet.de/blog/2013/10/the-return-of-the-byte-strings/

UTF8String wurde speziell für den Einsatz in mobilen Start in Delphi 10.1 Berlin wieder aktiviert.

+1

Sie brauchen eine explizite Typumwandlung, um eine "* W1057 implizite Zeichenfolge von 'string' in 'UTF8String' *" Warnung: 'U8: = UTF8String (mystr) zu vermeiden;' –

+0

Ich persönlich würde besser diese spezielle Warnung deaktivieren. Im Falle einer expliziten Typumwandlung würde jedoch keine temporäre Variable benötigt. –

+0

Ich würde die Warnung nicht deaktivieren. * Implizite * String-Umwandlungen * können * Daten modifizieren, weshalb überhaupt eine Warnung existiert. Eine * explizite * Umwandlung sagt dem Compiler, dass Sie das Risiko verstehen und akzeptieren. Die Warnung tritt bei jeder impliziten Zuweisung eines Zeichenfolientyps zu einem anderen Zeichenfolgentyp auf. Wenn der Ziel-String-Typ eine Ansi-Zeichenfolge ist, erhalten Sie eine etwas andere Warnung: 'W1058 Implizite String-Umwandlung mit möglichem Datenverlust von 'String' zu 'AnsiString'. –