2010-11-12 60 views
0

本质上,我想创建一个新的进程并从父进程为它定义环境。我想使用CreateProcessW并将(修改的)UNICODE环境传递到lpEnvironment,但我不确定与ANSII环境块相比,内容应该是什么样子。UNICODE环境块如何在Windows上通过CreateProcessW()启动新进程?

唯一的文档我才真正发现是MSDN:

注意一个ANSI环境块是 由两个零字节终止:一个用于 最后一个字符串,多了一个终止 块。 Unicode环境块 由四个零字节终止:两个 为最后一个字符串,另外两个以 终止该块。

现在我试图

  1. 呼叫GetEnvironmentStrings并把它传递给子进程
  2. 呼叫GetEnvironmentStringsW并把它传递给子进程
  3. 修改这些块与我的其他环境字符串和通过它

非他们工作

我真的只能将lpEnvironment设置为NULL才能使用它,但现在我必须更改&还原我父母的处理环境 - 是这样的吗?

(我也没有设置CREATE_UNICODE_ENVIRONMENT

谁能告诉我什么特别之处UNICODE环境块 - 它的工作,我只是用ASCII的东西,并呼吁CreateProcessA() ...

+0

发布您的代码。 – Stu 2010-11-12 19:41:32

+0

您使用“UNICODE”,但它应该“Unicode”。你使用“ANSII”,但这个词是“ANSI” - 也没有任何意义! – tchrist 2010-11-13 14:01:51

回答

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()); 
} 

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

+0

非常感谢你tyranid。道歉 - 我没有发布任何代码,但我对结构“env”字符串更感兴趣。你在最后使用2 \ 0,而win文档谈到4 \ 0字符来结束块(请参阅我在开始的帖子中的引用) - 你知道是否有真正的差异,或者我可以构建环境阻塞与我用ASCII做的一样吗? – Chris 2010-11-12 20:55:58

+0

好吧 - 我只是试了一遍,现在就开始工作了 - 诀窍是不遵循MS指导原则,并简单地使用1(!)'\ 0'字符来终止一个字符串和总共2(!)'\ 0 '字符来终止块 - NOT 4在他们的文档中写入:/ – Chris 2010-11-12 21:02:14

+3

@Chris - 文档说每个字符串以2个零字节结尾,整个块以4个零字节结尾。每个WCHAR是两个字节。因此,L'\ 0'在两个零字节中是1个零字符,并且L'\ 0 \ 0'是总共4个零字节中的2个零字符。 – Michael 2010-11-12 21:33:31

相关问题