【问题标题】:How does a UNICODE environment block look like to start a new process via CreateProcessW() on Windows?UNICODE 环境块如何通过 Windows 上的 CreateProcessW() 启动新进程?
【发布时间】:2011-05-09 06:38:10
【问题描述】:

本质上,我想创建一个新进程并从父进程为其定义环境。我想使用CreateProcessW 并将(修改后的)UNICODE 环境传递给lpEnvironment,但我不确定与ANSII 环境块相比内容应该是什么样子。

我真正找到的唯一文档是在 MSDN 上:

请注意,ANSI 环境块是 由两个零字节终止:一个用于 最后一个字符串,再终止一个 块。 Unicode 环境块 由四个零字节终止:两个 对于最后一个字符串,还有两个 终止块。

现在我尝试了

  1. 调用GetEnvironmentStrings并将其传递给子进程
  2. 调用GetEnvironmentStringsW并将其传递给子进程
  3. 用我的附加环境字符串修改这些块并传递它

它们都不起作用

我真的只能将 lpEnvironment 设置为 NULL 才能让它工作,但现在我必须更改并恢复我父母的处理环境 - 这是要走的路吗?

(我也设置了CREATE_UNICODE_ENVIRONMENT

谁能告诉我UNICODE 环境块有什么特别之处 - 当我只使用ASCII 的东西并调用CreateProcessA() 时,它确实有效...

【问题讨论】:

  • 您使用“UNICODE”,但应该使用“Unicode”。你使用“ANSII”,但这个词是“ANSI”——而且没有任何意义!!

标签: c++ unicode environment createprocess


【解决方案1】:

如果没有代码,我不知道你做错了什么。但这有效:

STARTUPINFO startInfo = {0};
PROCESS_INFORMATION procInfo = {0};

WCHAR env[] = L"key=value\0key2=value2\0\0";
WCHAR cmdline[] = L"calc";

startInfo.cb = sizeof(startInfo);
if(!CreateProcessW(NULL, cmdline, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, env, NULL, &startInfo, &procInfo))
{
    printf("Error %d\n", GetLastError());
}

也许这会让你知道你做错了什么。

【讨论】:

  • 非常感谢泰伦。抱歉-我没有发布任何代码,但我对“env”字符串的结构更感兴趣。您最后使用 2 \0 ,而 win 文档谈到 4 \0 字符来结束块(请参阅我文章开头的引用) - 你知道是否有真正的区别或者我可以构建环境阻塞与我使用 ASCII 的方式相同?
  • 好的——我又试了一次,现在就开始工作了——诀窍是不要遵循 MS 指南,而是简单地使用 1 (!) '\0' 字符来终止一个字符串,总共2 (!) '\0' 字符来终止块 - 不是他们在文档中写的 4:/
  • @Chris - 文档说每个字符串以 2 个零字节结尾,整个块以 4 个零字节结尾。每个 WCHAR 是两个字节。所以 L'\0' 是两个零字节中的 1 个零字符,而 L'\0\0' 是总共 4 个零字节中的 2 个零字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 2020-07-15
  • 2022-11-03
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多