解決:"
ShellAndWait(NULL, _FinalShellStrCmd, "WAIT", 240, 1);
stringstreamを使用してAppとArgを_FinalShellStrCmdに結合し、最初のargをNULLのままにします。スラッシュまたはバックスラッシュのいずれでも正常に機能しました。どうもありがとうございました。
Boostを使用して現在のパスを取得すると、 "d:/ bin / testが取得されます。次に、CreateProcess()ライブラリ関数を使用して以下のShellAndWait()を呼び出そうとします。ディレクトリパスにバックスラッシュ" \を使用します。例:d: \ bin\test。それは魅力のように機能します。
アプリのパスと引数をdosプロンプトに出力し、それらをコピーしてdosプロンプトに貼り付けると、正常に実行されました。例、D:/bin/test/test.exe d:/bin/test/test.dat app-path args
以下のShellWandWait関数にapp-pathとargsを配置しても、何も実行されませんでした。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;
}