3

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

4 回答 4

3

错误 2 是ERROR_FILE_NOT_FOUND。正如其他人告诉您的那样,当您需要使用绝对路径时,您依赖的是相对路径。

此外,LPCTSTR("test.exe")不是有效代码。如果UNICODE已定义,则CreateFile()映射到CreateFileW(),并LPCTSTR映射到LPCWSTRie const wchar_t*。您不能将 a 类型转换char*为 awchar_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-01T19:54:41.643 回答
0

test.exe永远不会在调用exe所在的目录中查找它。它正在当前目录中查找,该目录是每个进程的路径变量。也许当前目录没有指向test.exe居住的地方。您也不应该依赖它,因为它可以任意更改(例如通过使用文件对话框,或者当父进程更改它时)。

于 2013-11-01T19:32:01.960 回答
0

CreateProcess函数在涉及文件名时非常敏感,至少在我看来是这样。当您像这样指定您的exe时,您实际上是根据当前目录指定它,这可能与您的主exe所在的目录不同,这解释了找不到文件。一种解决方法是简单地使用GetModulePath获取当前 exe 的目录,从中删除 exe 名称,然后您就拥有相同的目录,或者只是使用绝对路径。

根据CreateProcess文档,第一个参数可以是 NULL :

lpApplicationName 参数可以为 NULL。在这种情况下,模块名称必须是 lpCommandLine 字符串中第一个以空格分隔的标记。

至少对我来说,如果您只指定命令行,它似乎比使用应用程序名称要好得多,而且在应用程序名称中您也无法处理命令行。

于 2013-11-01T19:32:10.583 回答
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 文件中,它将起作用。

于 2014-07-25T22:02:07.263 回答