我只是尝试通过PATH env解析其位置来运行新进程。变种。由于我使用Qt,这意味着我添加了
X:\文件夹\
到我的PATH变量,在我的启动应用程序中,我正在调用
另外,QProcess :: startDetached( “TEST.EXE”)
实际上有效。
然而,test.exe将数据写入其工作目录。这些数据最终出现在starter应用程序的目录中,而不是X:\ folder \,这不是我想要的。
我通过在CLI中键入“test.exe”直接在Windows命令行中测试了行为,并且它是相同的(将数据写入当前目录)。
是否有办法(在C ++或命令行中)使用PATH启动进程,同时还使用PATH中的目录作为新进程的工作目录?
我可以搜索我自己的PATH,分析查找并通过另一个QProcess :: startDetached()重载启动程序,但我想知道是否有更简单的方法。
答案 0 :(得分:1)
使用路径时,操作系统不会“移动到当前目录”。你必须自己做。 (在大多数情况下,你真的不希望应用程序移动到另一个目录 - 如果编译器在你执行gcc foo.c
时这样做了 - 那么你必须通过所有内容的完整路径,因为你当然不希望将源文件放在编译器所在的位置 - 在许多情况下,您甚至可能无法在Unix / Linux系统上写入该目录。
您必须预先添加正确的文件夹[我建议使用应用程序安装目录可能不是最佳位置!],或者chdir(...)
将当前工作目录更改为您想要的数据位置成为。大多数应用程序(使用在这样的特定位置存储文件的原理)在某个地方的设置中存储“默认目录”,因此用户可以更改设置以适合他/她的设置。
答案 1 :(得分:0)
至少有3个选项没有复杂的配置。
1 - 从您的调用应用程序更改当前目录到test.exe
程序所在的位置。这样,文件将转到所需的目录。但是,调用应用程序可能会出现问题或生成不应该生成的输出,因此需要在调用应用程序中更改当前目录
2 - 作为参数传递给test.exe
,它应该生成文件。
3 - 从test.exe
确定它所在的位置并使用此信息更改此过程的当前目录,或者,知道路径,在其所在的同一目录中生成文件。
TCHAR szPath[MAX_PATH];
if( !GetModuleFileName( NULL, szPath, MAX_PATH ) ) {
// handle error in GetModuleFileName
} else {
// now, szPath contains file path
};
这是检索当前进程位置的标准窗口方式。参考here: GetModuleFileName