未找到C++文件

未找到C++文件,c++,winapi,process,C++,Winapi,Process,我正试图使用CreateProcess启动一个子进程,但是我一直收到错误2,根据文档,该错误是找不到文件 我的代码如下所示: if (!(CreateProcess(LPCTSTR("test.exe") ,NULL ,NULL,NULL,FALSE ,0 ,NULL ,NULL ,&producer_si ,&producer))) { printf("Create process failed!(%d)\n", GetLastError(

我正试图使用CreateProcess启动一个子进程,但是我一直收到错误2,根据文档,该错误是找不到文件

我的代码如下所示:

if (!(CreateProcess(LPCTSTR("test.exe") ,NULL ,NULL,NULL,FALSE ,0  ,NULL ,NULL ,&producer_si
              ,&producer)))
{
    printf("Create process failed!(%d)\n", GetLastError());
}
void _tmain (int argc, TCHAR* argv[])
{
printf("%s\n", "hello!"); 
} 
其中test.exe是我之前创建的可执行程序。子进程非常简单,代码如下所示:

if (!(CreateProcess(LPCTSTR("test.exe") ,NULL ,NULL,NULL,FALSE ,0  ,NULL ,NULL ,&producer_si
              ,&producer)))
{
    printf("Create process failed!(%d)\n", GetLastError());
}
void _tmain (int argc, TCHAR* argv[])
{
printf("%s\n", "hello!"); 
} 
test.exe也位于与父进程相同的文件夹中。我不明白为什么我总是得到错误代码2。

test.exe从未在调用exe所在的目录中查找。正在当前目录中查找它,该目录是每个进程的路径变量。可能当前目录未指向test.exe所在的位置。您也不应该依赖它,因为它可以任意更改,例如使用文件对话框,或者当父进程更改它时。

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

根据文档,第一个参数可以为空:

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

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

错误2是错误文件未找到。正如其他人告诉您的,当您需要使用绝对路径时,您依赖于相对路径

此外,LPCTSTRtest.exe不是有效代码。如果定义了UNICODE,则CreateFile映射到CreateFileW,而LPCTSTR映射到LPCWSTR ie const wchar\u t*。您不能将char*类型转换为wchar\u t*并最终得到有意义的数据。如果要使用TCHAR敏感文本,请改用TEXT宏,例如:

if (!CreateProcess(TEXT("full path to\\test.exe"), ...))
否则,请忘记使用TCHAR,而只编写特定于Ansi或Unicode的代码,具体取决于您的需要:

if (!CreateProcessA("full path to\\test.exe", ...))

对于QT,MSDN函数文本无效:QTCreator的编译器返回:

“Lvar”未声明在此函数中的首次使用

其中,var是文本的输入,因为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文件中,它将起作用。

我强烈建议使用UTF-16版本的CreateProcess。ANSI版本有奇怪的行为,您应该使用Unicode版本,但如果使用lpCommandLine参数,请注意,它必须指向可写内存,因为CreateProcessW可以修改所指向的数据。CreateProcessA没有这个限制。正如Remy所说,您会被ANSI版本所困扰。这并不是说你应该放弃Unicode版本。你只需要把它做好。而且ANSI版本也需要一个常量字符串,这只是一个实现上的怪癖,可能会改变,让你摆脱它;我将是第一个承认我对Win32编程相当陌生的人,所以我不知道Win32实现的所有不同字符串