在Windows 7下,CreateProcess失败

7

我正在尝试在Windows 7的新环境下编译来自Windows XP的旧代码。它编译成功,但在运行时失败。

CreateProcess()返回0,GetLastError()返回2,表示ERROR_FILE_NOT_FOUND(找不到文件)。

以下是我的CreateProcess调用:

STARTUPINFO StartInfo;
memset(&StartInfo, 0, sizeof(StartInfo));

wcsncpy(astrCommandLine, L"TFTP", MAX_OSCOMMANDLINE_SZ-1); 
BOOL bFuncRetn = CreateProcess(NULL, 
              astrCommandLine,     // command line 
              NULL,          // process security attributes 
              NULL,          // primary thread security attributes 
              NULL,          // handles are inherited 
              0,             // creation flags 
              NULL,          // use parent's environment 
              NULL,          // use parent's current directory 
              &StartInfo,          // STARTUPINFO pointer 
              &m_ProcInfo );   // receives PROCESS_INFORMATION 

现在谈谈一些奇怪的事情:当我运行 calc 而不是 tftp 时,calc 弹出。我可以在命令提示符中从任何位置执行我的命令行,因此它告诉我 c:\windows\system32 的 %PATH% 已知并且工作正确。
我尝试强制使用 ansi 字符串创建 CreateProcessA,但得到了相同的结果。我还尝试了 debug 和 release 配置以及从命令行运行。
有什么想法吗?
编辑: calc.exe 和 tftp.exe 都位于 c:\windows\system32 中,它也在系统路径中。 运行 "c:\windows\system32\tftp" 不起作用。

应用程序路径是否可以找到tftp,而不是系统路径?这可能解释了为什么找到calc但找不到tftp。CreateProcess不使用App Paths。我假设你在某个地方设置了StartInfo.cb。 - David Heffernan
这几乎没有希望能够正常工作。tftp.exe肯定不在程序的默认工作目录中。Calc.exe没有问题,因为它在PATH中。请传递*.exe的完整路径名,例如c:\foo\bar\tfpt.exe。 - Hans Passant
2
这显然是个愚蠢的问题,但你确定你正在测试的系统上真的有tftp.exe吗?Windows 7不再默认安装tftp客户端,你需要通过“程序和功能”控制面板中的“Windows功能”添加它。 - tyranid
你尝试过使用进程监视器来监控你的程序吗?这将显示正在读取哪些文件和注册表键以及具体是什么导致了失败。 - Adam Rosenfield
你是否是在运行于64位系统的32位应用程序?我猜测您没有安装TFTP.EXE的32位版本。 - Raymond Chen
显示剩余5条评论
1个回答

11
问题在于您有一个32位的应用程序尝试执行64位Windows命令。为解决问题,您无需重新编译您的应用程序为64位。您只需将所有出现c:\windows\system32的地方更改为c:\windows\SysNative即可。
在Windows 7 x64中,32位程序对c:\windows\system32的引用会自动重定向到c:\windows\syswow64。使用特殊别名c:\windows\SysNative可以使Windows 7不进行重定向。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接