找不到CreateProcess()c ++文件

时间:2013-11-01 19:21:55

标签: c++ winapi process

我正在尝试使用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。

4 个答案:

答案 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文件中,它将起作用。