1

解決:"

    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;

}
4

3 に答える 3

0

boost:filesystem::pathオブジェクトを作成してから使用するのが最善の方法だと思いますmake_preferred()。ブースト ライブラリに文字置換ジョブを処理させます。

于 2011-04-13T17:20:52.597 に答える
0

CreateProcess がスラッシュを使用できないのには十分な理由があります。Windows プログラムでは、スラッシュをコマンド ライン オプション指定子として使用することがよくあります ("dir /w" や "format c: /q" など)。DOS の古いバゲージでは、スラッシュ引数をスペースで区切る必要はないと規定されています。そのため、DOS/Windows コンソール コマンドの次の形式も有効です: "dir/w", "format c:/q "。

Windows API プログラマーは CreateProcess がこれをサポートすることを望んでいたので、スラッシュをパス区切り記号として解析しないことにしたと思います。DOS および既存の Windows プログラムとの互換性は、POSIX との互換性よりも重要でした。

于 2011-04-13T17:09:52.400 に答える