我有一个使用 Delphi 2006 编译的应用程序,我想启动另一个在 XE2 中编译的应用程序并传递一个参数。我正在使用 ShellExecute 从 D2006 启动第二个应用程序,并且 ShellExecute 中的第四个参数需要 PANSIChar(作为传递给启动的应用程序的参数)。
我的 XE2 应用程序没有正确读取参数,可能是由于更改了 UNICODE 字符串。
有没有办法可以从我的 D2006 应用程序启动我的 XE2 应用程序并将字符串作为参数传递给它?
我有一个使用 Delphi 2006 编译的应用程序,我想启动另一个在 XE2 中编译的应用程序并传递一个参数。我正在使用 ShellExecute 从 D2006 启动第二个应用程序,并且 ShellExecute 中的第四个参数需要 PANSIChar(作为传递给启动的应用程序的参数)。
我的 XE2 应用程序没有正确读取参数,可能是由于更改了 UNICODE 字符串。
有没有办法可以从我的 D2006 应用程序启动我的 XE2 应用程序并将字符串作为参数传递给它?
您的 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。