-1

我有一个使用 Delphi 2006 编译的应用程序,我想启动另一个在 XE2 中编译的应用程序并传递一个参数。我正在使用 ShellExecute 从 D2006 启动第二个应用程序,并且 ShellExecute 中的第四个参数需要 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。你的问题在别处。

究竟在哪里,用这些信息是不可能知道的。一种明显的可能性是您的论点包含空格。这些空格被接收者 XE2 程序解释为参数分隔符。将你的论点用引号括起来。像这样:

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

另一种可能性是,当您收到参数时,您可能正在将参数转换为 PAnsiChar。如果是这样,不要。只需阅读 ParamStr(1) ,它是一个 Unicode 字符串。Windows 为您从 ANSI 转换而来。

我显然在这里最后猜测了一点,但坦率地说,没有足够的信息来明确诊断故障。但我可以确定 ANSI 文本在您的场景中被透明地转换为 Unicode。

于 2012-11-16T22:53:21.607 回答