【问题标题】:How to use CreateProcessAsUser with argument is japanese?如何使用带有参数的 CreateProcessAsUser 是日语?
【发布时间】:2015-01-14 11:47:49
【问题描述】:

我编写 Windows 服务来启动具有指定路径的应用程序并发送文件名作为其参数。 => 我在C# 代码上使用CreateProcessAsUser

  1. 如果文件名来自 a,b,c...z 字符 => 成功

  2. 如果文件名是日文=>文件名在申请时得到不正确

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 的结构。添加dwCreationFlagsCREATE_UNICODE_ENVIRONMENT

标签: c# c++ windows-services


【解决方案1】:

在所有结构和CreateProcessAsUser 例程中使用CharSet = CharSet.Unicode

【讨论】:

    猜你喜欢
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多