【发布时间】:2015-01-14 11:47:49
【问题描述】:
我编写 Windows 服务来启动具有指定路径的应用程序并发送文件名作为其参数。 => 我在C# 代码上使用CreateProcessAsUser:
如果文件名来自 a,b,c...z 字符 => 成功
如果文件名是日文=>文件名在申请时得到不正确
P/S:我调试了 windows 服务:传递给CreateProcessAsUser 的文件名是正确的,但在应用程序中不是。
问题:如果是日文,如何正确获取文件名?
更新:使用CreateProcessAsUserW()
[DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUserW", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public extern static bool CreateProcessAsUserW(IntPtr hToken, String lpApplicationName, String lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes,
ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandle, int dwCreationFlags, IntPtr lpEnvironment,
String lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation);
【问题讨论】:
-
使用 Unicode 版本,CreateProcessAsUserW
-
CreateProcessAsUserW 仅在相关应用程序支持 Unicode 文件名时才有效。如果没有,您可能必须更改代码页,我认为您可以使用 SetLocaleInfo()。我不确定更改系统帐户的代码页可能会产生什么副作用,或者是否可能。
-
@CoreTech 我找不到
CreateProcessAsUserW的dll,所以我通过添加W来更改CreateProcessAsUser。 对吗? -
不,调用W版本时,CharSet应该是Unicode,而不是Ansi。
-
@HarryJohnston 现在我解决了这个问题。我使用
CreateProcessAsUser和所有带有Charset = CharSet.Unicode的结构。添加dwCreationFlags和CREATE_UNICODE_ENVIRONMENT
标签: c# c++ windows-services