解决方案:”
ShellAndWait(NULL, _FinalShellStrCmd, "WAIT", 240, 1);
使用 stringstream 将 App 和 Arg 组合成 _FinalShellStrCmd,将第一个 arg 保留为 NULL。它适用于正斜杠或反斜杠。再次感谢大家。
我正在使用 boost 来获取当前路径,然后我得到“d:/bin/test。现在,我尝试使用 CreateProcess() 库函数调用下面的 ShellAndWait()。在目录路径中使用反斜杠“\ 例如..d: \bin\测试。它就像魅力一样。
我已将应用程序路径和参数打印输出到 dos 提示符,然后我将它们复制并传递到 dos 提示符,它执行正常。例如,D:/bin/test/test.exe d:/bin/test/test.dat app-path args
如果我将 app-path 和 args 放到下面的 ShellWandWait 函数中,它什么也没做。我怀疑 CreateProcess() 不会采用正斜杠“/”的路径或目录。有人在这里给我点灯吗?再次感谢。
int BasicExcelCell::ShellAndWait(char *AppName, char *AppArgument, char *Wait, DWORD TimeOut=0, DWORD IgnoreErrorFlag=0)
{
PROCESS_INFORMATION ProcessInfo; //This is what we get as an [out] parameter
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
TimeOut = TimeOut * 1000;
if (Wait == "NOWAIT")
ShellExecute(NULL,"open",AppName, AppArgument," ", SW_SHOW );
else //WAIT
{
//printf("ShellExecute WAIT\n");
printf("Appname:%s AppArgs:%s\n", AppName, AppArgument);
UINT olderrormode;
if (IgnoreErrorFlag)
{
olderrormode = SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX);
}
if (CreateProcess(AppName, AppArgument,
NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
std::cout<<"WaitingSingleOjbec"<<endl;
DWORD dwret = WaitForSingleObject(ProcessInfo.hProcess,TimeOut);
switch (dwret)
{
case WAIT_OBJECT_0:
break;
case WAIT_TIMEOUT:
default:
TerminateProcess(ProcessInfo.hProcess,0);
break;
}
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
if (IgnoreErrorFlag)
{
SetErrorMode(olderrormode);
}
}
return 0;
}