C++ 从另一个应用启动我的应用时出现相对路径更改问题

C++ 从另一个应用启动我的应用时出现相对路径更改问题,c++,qt,C++,Qt,我面临一个困惑的问题,我有一个应用程序(我们称之为a.exe),在我的应用程序中,它可以启动另一个应用程序(B.exe),在我的文件夹中,a.exe和B.exe位于同一文件夹中,因此这里B.exe的相对路径是“B.exe” 但是,现在另一个应用程序(C.exe)可以运行A.exe,C.exe在另一个文件夹中,所以问题来了,如果A.exe是从C.exe启动的,它永远不能运行C.exe,因为我收到一个错误,说它找不到C.exe 所以我认为相对路径改为当前C.exe的文件夹,在C.exe文件夹中,没有

我面临一个困惑的问题,我有一个应用程序(我们称之为a.exe),在我的应用程序中,它可以启动另一个应用程序(B.exe),在我的文件夹中,a.exe和B.exe位于同一文件夹中,因此这里B.exe的相对路径是“B.exe”

但是,现在另一个应用程序(C.exe)可以运行A.exe,C.exe在另一个文件夹中,所以问题来了,如果A.exe是从C.exe启动的,它永远不能运行C.exe,因为我收到一个错误,说它找不到C.exe

所以我认为相对路径改为当前C.exe的文件夹,在C.exe文件夹中,没有B.exe

有朋友知道这个问题吗?或者,如何在不同的状态下获得正确的相对路径来解决此问题

我使用ShExecInfo运行我的c.exe,一些代码如下:

QStringList paramList;
paramList.push_back("requiresAdmin");
QString paramsAsOneString = paramList.join(' ');
LPCWSTR szParams = reinterpret_cast<LPCWSTR>(paramsAsOneString.utf16());
LPCWSTR szAppName = reinterpret_cast<LPCWSTR>(appName.utf16());

SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = L"runas";
ShExecInfo.lpFile = szAppName;
ShExecInfo.lpParameters = szParams;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
QStringList参数列表;
paramList.push_back(“requireadmin”);
QString paramsAsOneString=paramList.join(“”);
LPCWSTR szParams=reinterpret_cast(paramsAsOneString.utf16());
LPCWSTR szAppName=reinterpret_cast(appName.utf16());
SHELLEXECUTEINFO ShExecInfo={0};
ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask=参见屏蔽过程;
ShExecInfo.hwnd=NULL;
ShExecInfo.lpVerb=L“runas”;
ShExecInfo.lpFile=szAppName;
ShExecInfo.lpParameters=szParams;
ShExecInfo.lpDirectory=NULL;
ShExecInfo.nShow=SW_SHOW;
ShExecInfo.hInstApp=NULL;

如果您从其他应用程序启动应用程序,您也必须设置文件夹。我的意思是,如果C在路径C中,C启动路径A中的应用程序A,进程A在路径C中运行,因此当您尝试运行进程B时,它是不可访问的

例如,您还必须设置文件夹。在Ubuntu中运行nautilus时,还必须设置文件夹:

  user:~Documents/$: nautilus /home/user/
如果是,nautilus将在给定文件夹中打开。如果没有,nautilus将在启动它的进程的文件夹中打开,在本例中为Documents文件夹


为避免此问题,如果B.exe始终与A.exe位于同一文件夹中,则使用函数使用可执行文件的相对路径来启动B.exe。

如果从其他应用程序启动应用程序,则也必须设置文件夹。我的意思是,如果C在路径C中,C启动路径A中的应用程序A,进程A在路径C中运行,因此当您尝试运行进程B时,它是不可访问的

例如,您还必须设置文件夹。在Ubuntu中运行nautilus时,还必须设置文件夹:

  user:~Documents/$: nautilus /home/user/
如果是,nautilus将在给定文件夹中打开。如果没有,nautilus将在启动它的进程的文件夹中打开,在本例中为Documents文件夹


为避免此问题,如果B.exe始终与A.exe位于同一文件夹中,则使用函数使用可执行文件的相对路径来启动B.exe。

您应该获得
A.exe
(使用
GetModuleFileName
)的完整路径,并将
A.exe
最后替换为
B.exe
。酷,我用完整路径解决它,谢谢你,伙计!你应该获得
A.exe
(使用
getModuleFileName
)的完整路径,并将
A.exe
的结尾替换为
B.exe
。酷,我使用完整路径解决了这个问题,谢谢你!对我来说非常有用,不同的是我使用QCoreApplication::applicationDirPath()获得绝对路径,非常感谢,我的朋友。对我来说非常有用,不同的是我使用QCoreApplication::applicationDirPath()获得绝对路径,非常感谢,我的朋友。