我正在尝试使用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。
答案 0 :(得分:2)
错误2是ERROR_FILE_NOT_FOUND
。正如其他人告诉你的那样,当你需要使用绝对路径时,你依赖于相对路径。
此外,LPCTSTR("test.exe")
不是有效代码。如果定义了UNICODE
,则CreateFile()
会映射到CreateFileW()
,LPCTSTR
会映射到LPCWSTR
,即const wchar_t*
。您无法将char*
类型转换为wchar_t*
并最终获得有意义的数据。如果您想使用TCHAR
- 敏感文字,请改用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", ...))
答案 1 :(得分:0)
test.exe
所在的目录中查找 exe
。它正在当前目录中查找,这是一个每进程路径变量。也许当前目录没有指向test.exe
所在的位置。您也应该永远不要依赖它,因为它可以随意更改(例如,通过使用文件对话框,或父进程更改它)。
答案 2 :(得分:0)
至少在我看来,CreateProcess函数在文件名方面非常敏感。 当你指定你的exe时,你实际根据当前目录指定它,这可能与你的主exe所在的目录不同,这解释了找不到的文件。 一种方法是简单地使用GetModulePath来获取当前exe的目录,并从那里获得exe名称,并且你有相同的目录,或者只是使用绝对路径。
根据CreateProcess文档,第一个参数可以是NULL:
lpApplicationName参数可以为NULL。在这种情况下,模块名称必须是lpCommandLine字符串中第一个以空格分隔的标记。
至少在我看来,如果你只是指定命令行,它只会比应用程序名称更好,并且在应用程序名称中也无法处理命令行。
答案 3 :(得分:0)
使用QT MSDN函数TEXT()它不起作用:QTCreator的编译器返回:
'Lvar'未声明(首次使用此功能)
其中 var 是Text()的输入,因为QT的启用UNICODE因此:
#ifdef UNICODE
/*
* NOTE: This tests UNICODE, which is different from the _UNICODE define
* used to differentiate standard C runtime calls.
*/
typedef WCHAR TCHAR;
typedef WCHAR _TCHAR;
/*
* __TEXT is a private macro whose specific use is to force the expansion of a
* macro passed as an argument to the macro TEXT. DO NOT use this
* macro within your programs. It's name and function could change without
* notice.
*/
#define __TEXT(q) L##q
#else
typedef CHAR TCHAR;
typedef CHAR _TCHAR;
#define __TEXT(q) q
#endif
#endif
特别是这段话:
#define __TEXT(q) L##q
windows.h 中包含 winnt.h 中的因此,要解决这个问题,我们必须添加:
DEFINES -= UNICODE
在QTCreator项目的.pro文件中,它将起作用。