未找到C++文件
我正试图使用CreateProcess启动一个子进程,但是我一直收到错误2,根据文档,该错误是找不到文件 我的代码如下所示:未找到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(
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实现的所有不同字符串