【问题标题】:SHELLEXECUTEINFO UNICODE support?SHELLEXECUTEINFO UNICODE 支持?
【发布时间】:2012-09-12 13:15:18
【问题描述】:

我使用ShellExecuteEx() 来调用一个可执行文件。以下是我为SHELLEXECUTEINFO结构设置的参数。

SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS|SEE_MASK_UNICODE;// Set Unicode Flag
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpParameters = TEXT ("/s");
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOWNORMAL;
ShExecInfo.hInstApp = NULL;
ShExecInfo.lpFile = TEXT ( ".\\bin\\x86\\installerx86.exe" ); 

ShExecInfo.fMask 设置为 Unicode,但 ShExecInfo.lpFile 没有以 "\\?\" 开头。 在这种情况下,我的代码是否与 Unicode 兼容?

【问题讨论】:

标签: c windows winapi unicode


【解决方案1】:

你混淆了概念。到内核​​代码使用这些字符串时,所有路径字符串都是 Unicode。 ShellExecuteEx 的非Unicode 版本(名为ShellExecuteExA)简单地翻译所有字符串并将SHELLEXECUTEINFOA 结构转换为SHELLEXECUTEINFOW 结构,然后调用real api 函数ShellExecuteW()。您不会在代码中看到这些真正的标识符名称,因为宏会在它们之间进行选择,但您当然可以在 ShellAPI.h SDK #include 文件中看到它们。

SEE_MASK_UNICODE 是一个相当神秘的选项,很难正确设置。我觉得和CreateProcess的CREATE_UNICODE_ENVIRONMENT选项有关,说明新进程的环境可能包含Unicode字符。

路径字符串上的 \\?\ 前缀在 Win32 路径名和本机 Windows 内核路径名之间进行选择。 Win32 是原生操作系统之上的 API 层。曾经有多个 api 层,OS/2 和 Posix 曾经支持但不再使用。本机操作系统与 Win32 非常不同,它类似于 VMS 操作系统,这是 David Cutler 在被微软聘用设计 NT 之前所做的。没有 C: drive 之类的东西,它只知道,比如说,\Device\Harddisk0\Partition0

API 层在这两个世界之间进行转换。通过在路径字符串前面加上\\?\,您告诉Win32 按原样使用路径字符串。然后使其获得本机路径字符串的功能,支持长达 32726 个字符的路径并绕过臭名昭著的 Win32 MAX_PATH 限制。这些字符串是 Unicode 是隐含的,这就是内核可以处理的所有内容。 ShellExecuteA 会很乐意为您转换包含此前缀的 8 位编码字符串。

长话短说:它不是自动的。您必须通过自己对前缀进行编程来显式执行此操作。

【讨论】:

  • 感谢您的回答。我有这样的路径“.\\dist\\driver\\fileName。我可以在此路径之前添加“\\?\\”(它不起作用)还是只有我可以添加到完整路径,例如c: \\Package\\dist\\driver\\fileName? 请查看此链接stackoverflow.com/questions/12299123/… 供您参考...
  • 相对路径是Win32的概念,不是内核的概念,所以以“\\?\”开头的路径不能是相对路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 2011-04-15
  • 2011-10-16
  • 2014-12-25
  • 2013-05-29
  • 2010-09-07
相关资源
最近更新 更多