我试图使用CreateProcess
启动子进程,但是我一直得到error 2
,根据文档,这个文件是找不到的。
我的代码如下所示:
if (!(CreateProcess(LPCTSTR("test.exe") ,NULL ,NULL,NULL,FALSE ,0 ,NULL ,NULL ,&producer_si
,&producer)))
{
printf("Create process failed!(%d)\n", GetLastError());
}
其中test.exe
是我之前创建的一个可执行程序。子进程非常简单,代码如下所示:
void _tmain (int argc, TCHAR* argv[])
{
printf("%s\n", "hello!");
}
test.exe
也与父进程在同一个文件夹中找到。我不明白为什么我总是得到错误代码2。
发布于 2013-11-01 19:54:41
错误2是ERROR_FILE_NOT_FOUND
。正如其他人告诉您的那样,当您需要使用一个绝对路径时,您依赖的是一个相对路径。
另外,LPCTSTR("test.exe")
不是有效的代码。如果定义了UNICODE
,则CreateFile()
映射到CreateFileW()
,LPCTSTR
映射到LPCWSTR
ie const wchar_t*
。您不能将char*
键入到wchar_t*
并得到有意义的数据。如果要使用TCHAR
-sensitive文本,请使用TEXT()
宏,例如:
if (!CreateProcess(TEXT("full path to\\test.exe"), ...))
否则,不要使用TCHAR
,只需编写特定于Ansi或Unicode的代码,这取决于您的需要:
if (!CreateProcessA("full path to\\test.exe", ...))
if (!CreateProcessW(L"full path to\\test.exe", ...))
发布于 2013-11-01 19:32:01
test.exe
永远不会在调用exe
的目录中被查找。它正在当前目录中查找,该目录是每个进程路径变量。可能当前目录没有指向test.exe
所在的位置。您也不应该依赖它,因为它可以任意更改(例如,通过使用文件对话框,或者当父进程更改它时)。
发布于 2013-11-01 19:32:10
CreateProcess函数在文件名方面非常敏感,至少在我看来是这样的。当您这样指定您的exe时,您实际上根据当前目录指定它,该目录可能与您的主exe所在的目录不相同,这说明文件找不到。一种方法是简单地使用GetModulePath来获取当前exe的目录,从该目录中删除exe名称,或者使用绝对路径。
根据CreateProcess文档,第一个参数可以为NULL:
lpApplicationName参数可以为NULL。在这种情况下,模块名必须是lpCommandLine字符串中第一个空格分隔的令牌。
至少对我来说,如果您只指定命令行,那么它比使用应用程序名称要好得多,而且在应用程序名称中,也不能处理命令行。
https://stackoverflow.com/questions/19733915
复制相似问题