【发布时间】:2011-08-09 22:51:57
【问题描述】:
我正在尝试在 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,但得到了相同的结果。我还尝试了调试和发布配置以及命令行。
有什么想法吗?
编辑:
calc.exe 和 tftp.exe 都位于系统路径中的 c:\windows\system32 中。
运行“c:\windows\system32\tftp”不起作用
【问题讨论】:
-
tftp 是通过应用路径而不是系统路径找到的吗?这可能解释了为什么找到 calc 但没有找到 tftp。 CreateProcess 不使用应用程序路径。我假设您在某处设置 StartInfo.cb。
-
这行得通的希望非常渺茫。当然 tftp.exe 不在您程序的默认工作目录中。 Calc.exe 没有问题,它在 PATH 上。传递 .exe 的 full 路径名,例如 c:\foo\bar\tfpt.exe。
-
我从未听说过 StartInfo.cb
-
显然是一个愚蠢的问题,但您确定您正在测试的系统上什至有 tftp.exe 吗? Windows 7默认不再安装tftp客户端,需要通过“程序和功能”控制面板中的“Windows功能”添加。
-
你试过用Process Monitor监控你的程序吗?这应该准确显示正在读取哪些文件和注册表项以及失败的确切原因。
标签: c++ windows createprocess