将PANSIChar参数从Delphi 2006 app传递给XE2 app

时间:2012-11-16 22:43:38

标签: delphi delphi-xe2 delphi-2006

我有一个使用Delphi 2006编译的应用程序,我想启动另一个在XE2中编译的应用程序并传递一个参数。我正在使用ShellExecute从D2006启动第二个应用程序,ShellExecute中的第4个参数需要PANSIChar(作为传递给已启动应用程序的参数)。

我的XE2应用程序没有正确读取参数,可能是因为更改了UNICODE字符串。

有没有办法可以从我的D2006应用程序启动我的XE2应用程序并将字符串作为参数传递给它?

1 个答案:

答案 0 :(得分:4)

您的Delphi 2006程序正在调用ShellExecute的ANSI版本,即ShellExecuteA。它接收ANSI参数。

当这些参数到达您的Delphi XE2程序时,它们将通过GetCommandLine检索。而XE2程序将调用Unicode版本GetCommandLineW。

但在幕后,Windows将为您从ANSI转换为Unicode。

这种上下文敏感的转换一直在Windows中发生。例如,为WM_SETTEXT调用SendMessageA,传递PAnsiChar。但是窗口是一个Unicode窗口,所以收到一个PWideChar。系统必须是这样的。其他任何东西都是无政府状态。

问题的根源不是一个程序使用ANSI,而另一个程序使用Unicode。你的问题在别处。

确切地说,这些信息是不可能的。一个明显的可能性是你的参数包含空格。这些空格被接收者XE2程序解释为参数分隔符。用引号标记你的参数。像这样:

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

另一种可能性是,当您收到PAnsiChar时,您可能正在向PAnsiChar提出论据。如果是这样,不要。只需阅读ParamStr(1),这是一个Unicode字符串。由Windows为您转换为ANSI。

我在这里结束时显然有点猜测,但坦率地说,没有足够的信息可以明确地诊断故障。但我可以确定ANSI文本在您的方案中透明地转换为Unicode。