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