2011-08-09 80 views
6

我试图在Windows 7下的新环境下编译Windows XP中的遗留代码。它编译但在运行时失败。在Windows 7下的CreateProcess失败

的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 

现在的怪事:不是TFTP当我运行计算,钙会弹出。我可以在命令提示符中的任何位置执行命令行中的任何命令,以便告诉我%PATH%到c:\ windows \ system32是已知的并且正常工作。

我试图用ANSI字符串强制CreateProcessA,但我得到了相同的结果。我也尝试在调试和发布配置和从命令行。

有什么想法?

编辑: calc.exe和tftp.exe都位于系统路径中的c:\ windows \ system32中。
运行“c:\ windows \ system32 \ tftp”不起作用

+0

tftp是由应用程序路径而不是系统路径找到的?这可能解释为什么找到calc,但tftp不是。 CreateProcess不使用应用程序路径。我假设你在某处设置了StartInfo.cb。 –

+0

这一切都很有希望。当然tftp.exe不在您的程序的默认工作目录中。 Calc.exe不是问题,它在PATH上。传递.exe的* full *路径名,例如c:\ foo \ bar \ tfpt.exe。 –

+0

我从来没有听说过StartInfo.cb – Eric

回答

9

问题是您有一个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不执行重定向。