0

PChar をパラメーターとして受け取る XE2 で記述された DLL があります (したがって、Unicode 文字列です)。この DLL を呼び出すアプリケーションを Delphi 2006 で作成したいと考えていました。これは可能ですか? PChar パラメータを渡すにはどうすればよいですか? Delphi XE2 でそれを行っていた場合、単純に次のようにします。

tmpString := 'hello';
DLL_Call(PChar(tmpString));

Delphi 2006 で tmpString を WideString として定義しようとしましたが、WideString と XE2 Unicode 文字列はかなり異なると思いますか?

文字列を DLL に正しく渡す方法はありますか? 私は DLL ソース コードを管理しているので、明らかに関数定義を PAnsiChar に変更できますが、これは避けたいと思います。可能であれば、Delphi 2006 側からの解決策を期待していました。

4

3 に答える 3

3

を受け取る関数として宣言する必要がありますPWideChar。そしてWideString、ペイロードを保持するために使用します。

function DLL_Call(S: PWideChar); stdcall; external 'mylib.dll';

......
var
  tmpString: WideString;
......
tmpString := 'hello';
DLL_Call(PWideChar(tmpString));

PCharエイリアスであることを忘れないでください。Unicode 以前の Delphi では、これは のエイリアスPAnsiCharです。Unicode Delphi では、これは のエイリアスPWideCharです。Unicode 以前の Delphi は、任意の Unicode API を完全に呼び出すことができますが、PWideChar明示的に使用する必要があります。

于 2012-06-29T09:23:31.110 に答える
2

Delphi 2006 で tmpString を WideString として定義しようとしましたが、WideString と XE2 Unicode 文字列はかなり異なると思いますか?

彼らはそうします。ただし、どちらも WideChar の C スタイル #0 終端配列、つまり PWideChar との間で変換できます。唯一の潜在的な問題は、ターミネータとして以外に #0 を含む文字列を渡すことができないことです。

UnicodeString引数でa を受け入れる関数を呼び出そうとした場合、あなたの異議は有効ですがWideString、それはあなたがしていることではありません。したがって、すでに見つけた解決策は正しいものです。

于 2012-06-29T09:27:20.223 に答える
0

それは、DLLPWideCharが渡された をどのように使用するかに大きく依存します。DLL がメモリの割り当て方法について仮定を行わない限り、メモリからの読み取りまたはメモリへの書き込みのみを行う場合、aWideStringは正常に機能します。 WidestringRTL によって異なる方法でUnicodeString管理されますが、両方とも UTF-16 でエンコードされたペイロードが含まれているため、互いにコンテンツ互換性があります。どちらもペイロードの最後に文字が含まれています。これは、DLL がポインター#0のみを受け入れるため重要です。その依存関係を回避するには、DLL を更新して、文字列の長さもパラメーターとして受け入れるようにする必要があります。次に例を示します。PCharPChar

D2006:

function DLL_Call(S: PWideChar; L: Integer); stdcall; external 'mylib.dll'; 

var 
  tmpString: WideString; 

tmpString := 'hello'; 
DLL_Call(PWideChar(tmpString), Length(tmpString)); 

XE2:

function DLL_Call(S: PChar; L: Integer); stdcall; external 'mylib.dll'; 

var 
  tmpString: String; 

tmpString := 'hello'; 
DLL_Call(PChar(tmpString), Length(tmpString)); 
于 2012-06-29T09:26:15.980 に答える