2016-05-04 64 views
2

私はVisual Studioのコンパイル済みDLLでDelphiのC extern関数を呼び出しています。次に、DLLメソッドは、引数としてC++文字列型をとるC++メソッドを呼び出します。 Delphiの最後の文字列はUTF-8でエンコードされています(BOMはありません)。私は、文字列型を取るC++メソッドがUTF-8でエンコードされた文字列を取得することを確認する必要があります。UTF-8文字列をDelphiからDLL C extern関数に渡すには?

私はDLLのソースコードを変更することができます。私の質問:

Delphi側の私のUTF-8文字列はstring型です。 C externメソッドはどのような型を取るべきですか? PChar、PWideChar?それをC++の文字列型に変換するにはどうしたらいいですか?

注:UTF-8文字列をAnsiStringに変換することはできません。なぜなら、エンコードには保持する必要があるギリシャ文字が格納されているからです。 C++エンドは、Delphi文字列のコピーを作成し、割り当てられたメモリの処分を処理します。 (XE6を使用)

Delphiの終わり:

mystr : string; 

callCExternMethod (mystr) // cast to what? 

C++エンド(VS 2013を使用して):PAnsiChar(Utf8String(str)):デルファイ側で

void callCExternMethod (????? mystr) { 

    // convert mystr to C++ string type 

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

確かにこの質問は100回あります.....あなたはグーグルで試してみましたか?テキストを使用するWindows関数を呼び出すたびに、これを行うことになります。 – Johan

+1

デルファイ側のPAnsiChar。 C++側のconst char *関数を呼び出す前に、nullで終了したutf8をエンコードする必要があります。 RTLにはそのための機能があります。検索を試みてください。 –

+0

必須読書:http://rvelthuis.de/articles/articles-pchars.html – Johan

答えて

6

パラメータを使用すると、このように通過するPAnsiCharです。

C++側では、パラメータはconst char*と表示されます。

明らかに、呼び出し規約が一致するようにする必要があります。

+0

それはうまくいった。私は答えに感謝します。答えを知っている私は今、似たような反応があることがわかります。何らかの理由で表示されなかったhttp://stackoverflow.com/questions/21867113/how-to-use-unicode-from-delphi-in-c-dll私の検索で。レスポンダの時間を不必要に使い果たしてしまったことをお詫び申し上げます。余計だと思われる質問は削除してください。 – rhody

+0

Delphi 2009以降では、 'UTF8Encode()'は非推奨です。代わりに 'PAnsiChar(UTF8String(str))'を使用するか、単に 'str'を' UTF8String'として宣言してから、 -is: 'PAnsiChar(str)'です。 –

+0

@RemyLebeau UTF8Stringは "nex gen"で禁止されました。Delphi for LLVM –

1

別のオプションはUTF8Stringタイプを使用することです:

mystr : string; 
u8: UTF8String; 

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

注:UTF8Stringタイプは、10.0シアトル経由のDelphi XE5でのモバイルプラットフォーム上で使用することはできませんあなたがそれを可能にするためのパッチを使用しない限り:

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

UTF8Stringデルファイ10.1ベルリンでのモバイルの出発での使用のために再有効化されています。

+1

「文字列」から「UTF8String」への* W1057暗黙的な文字列キャストを避けるためには、明示的な型キャストが必要です*:警告: 'u8:= UTF8String(mystr);' –

+0

個人的には特定の警告を無効にしてください。明示的な型キャストの場合、一時変数は必要ありません。 –

+0

警告を無効にしません。 *暗黙の*文字列キャスト*はデータを変更する可能性があります。そのため、警告はまったく存在します。 * explicit *キャストは、リスクを理解して受け入れることをコンパイラーに指示します。この警告は、1つの文字列型を異なる文字列型に暗黙的に割り当てるたびに発生します。ターゲットの文字列型がAnsi文字列の場合、W1058の '文字列'から 'AnsiString'への潜在的なデータ損失を伴う暗黙的な文字列キャストという、少し異なる警告が表示されます。 –

関連する問題