-1

Delphi 2006を使用してコンパイルされたアプリケーションがあり、XE2でコンパイルされた別のアプリケーションを起動して、パラメーターを渡したいと思います。ShellExecuteを使用してD2006から2番目のアプリを起動していますが、ShellExecuteの4番目のパラメーターはPANSICharを予期しています(起動されたアプリケーションに渡されるパラメーターとして)。

XE2アプリがパラメーターを正しく読み取っていません。これは、おそらくUNICODE文字列が変更されたためです。

D2006アプリケーションからXE2アプリケーションを起動し、それに文字列をパラメーターとして渡す方法はありますか?

4

1 に答える 1

4

Delphi 2006 プログラムは、ANSI バージョンの ShellExecute、つまり ShellExecuteA を呼び出しています。ANSI パラメータを受け取ります。

これらの引数は、Delphi XE2 プログラムに到着すると、GetCommandLine を介して取得されます。XE2 プログラムは、Unicode バージョンの GetCommandLineW を呼び出します。

しかし、バックグラウンドで Windows が ANSI から Unicode に変換しています。

この種のコンテキスト依存の変換は、Windows で常に発生します。たとえば、WM_SETTEXT に対して SendMessageA を呼び出し、PAnsiChar を渡します。ただし、ウィンドウは Unicode ウィンドウであるため、PWideChar を受け取ります。システムはこうでなければなりません。それ以外は無政府状態になります。

問題の原因は、一方のプログラムが ANSI を使用し、もう一方のプログラムが Unicode を使用していることではありません。あなたの問題は他の場所にあります。

正確には、この情報ではわかりません。明らかな可能性の 1 つは、引数にスペースが含まれていることです。これらのスペースは、受信者である XE2 プログラムによって引数区切り文字として解釈されます。引数を引用符で囲みます。このような:

ShellExecute(..., '"argument with spaces"', ...);

別の可能性としては、引数を受け取ったときに引数を PAnsiChar にキャストしている可能性があります。もしそうなら、しないでください。Unicode 文字列である ParamStr(1) を読むだけです。Windows によって ANSI から変換されます。

ここで最後に明らかに少し推測していますが、率直に言って、障害を決定的に診断するのに十分な情報はありません. しかし、あなたのシナリオでは、ANSI テキストが透過的に Unicode に変換されることは確かです。

于 2012-11-16T22:53:21.607 に答える