1

CreateProcess()とからの戻り値が競合しているため、少し混乱していますGetLastError()。以下のような方法で使用CreateProcess()すると、成功し、必要なタスクを達成しているように見えます。それでも、GetLastError()Access is Denied が返されます。

アクセスが拒否された場合、タスクが完了したように見えるのはなぜですか。対照的に、CreateProcess()成功した場合、GetLastError()返されるアクセスが拒否されるのはなぜですか?

それとも私の使い方がGetLastError()間違っていますか?CreateProcess()失敗した値を返す場合にのみ使用することになっていますか? (以下の行動に対する私の正当化は、後悔するよりも安全である方がよいと考えたということでした)

    SetLastError(0);
    hello = CreateProcess(_T("C:\\Windows\\System32\\cmd.exe"), 
        _T("C:\\Windows\\System32\\cmd.exe /C ant debug"),
        NULL,NULL,false,0,NULL,
        _T("C:\\My\\Directory"),&siStartupInfo, &piProcessInfo);
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER 
        |FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(), 
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
        (LPTSTR)&errorText, 0, NULL); 
    AfxMessageBox(errorText);

この種の行動は正常ですか?CreateProcess()ドキュメントでは、失敗した場合の使用について言及していますが、その逆については言及していませんGetLastError()CreateProcess()ドキュメントを批判するのではなく、明確にしたいだけです。

これは、 の 2 番目のパラメーターが is でCreateProcess()あるかどうかに関係なく発生しますNULL。多分それはcmd.exe許可と関係がありますか?だったらCreateProcess()失敗するんじゃないの?ありがとうございました。

4

2 に答える 2

3

のドキュメントからGetLastError

最後のエラー コードを設定する各関数のドキュメントの戻り値のセクションには、関数が最後のエラー コードを設定する条件が記載されています。スレッドの最終エラー コードを設定するほとんどの関数は、失敗したときにそれを設定します。ただし、一部の関数は、成功したときに最後のエラー コードも設定します。[鉱山を強調]

CreateProcess成功すると、エラー値が返されるように設定されていないため、経験豊富な結果が得られると思いますGetLastError。代わりに、への呼び出しGetLastErrorは、以前に呼び出された別の関数によって設定されたエラーを返します

于 2012-06-18T19:46:39.457 に答える
1

GetLastErrorドキュメントに意味があると記載されている場合にのみ意味があります。

GetLastErrorは、 で設定された Win32 スレッドの最後のエラーを返しますSetLastError。関数は、そうすることが文書化されている場合にのみ最後のエラーを設定またはクリアすることになっているため、それが発生していない場合、最後のエラーには関連のない以前のエラーが含まれている可能性があります。

CreateProcess成功した場合ではなく、失敗した場合に最後のエラーを設定することが文書化されています。だから無視すればいい。

于 2012-06-18T19:45:22.640 に答える