我刚刚开始用C ++编写控制台应用程序。它进行了一些验证,然后需要找到并运行一个可执行文件,具体取决于部署方式,该可执行文件可以在各个地方出现。因此,大多数脚本可以运行,甚至运行部分也可以运行,具体取决于操作系统和位置。如果是本地计算机,则可以运行;如果是Windows 7,则即使在UNC上也可以运行。但是在Windows 10中,它只是退出。
脚本找到该exe并从其所在的路径运行它。当我将应用程序创建为批处理文件并使用popD移至工作目录的exe位置时,它可以工作,但是我似乎无法模仿该功能在C ++中。我已经尝试过SetCurrentDirectory
,但不会传递我要传递的字符串。
if (version >= minver)
{
std::string name = "testApp.exe";
std::string path = (fs::current_path().string());
for (const auto& entry : fs::recursive_directory_iterator(path))
{
std::string list = entry.path().string();
int found;
if ((found = list.find(name)) !=list.npos)
{
std::cout << list << std::endl;
\\This is the part that sometimes works and sometimes doesn't
system(list.c_str());
}
}
}
由于您可以从控制台启动程序,请尝试在控制台模式下使用CreateProcess
功能:
int runProcessFromCmd( char* pcExecPath)
{
if( NULL == pcExecPath)
{
printf("empty path!");
return -1;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset( &si, 0, sizeof(si) );
memset( &pi, 0, sizeof(pi) );
si.cb = sizeof(si);
// Start child process from command line
// First parameter = NULL => we use cmd
if( !CreateProcess( NULL, pcExecPath, NULL,NULL, FALSE, 0, NULL, NULL, &si, &pi ))
{
printf( "CreateProcess failed with error (%d).\n", GetLastError() );
return -2;
}
// Wait child process
WaitForSingleObject( pi.hProcess, INFINITE );
// Close all handles
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}