-1

GetLastError への次の呼び出しを伴う CopyFileEx は、約 2 か月前 (おそらく 2015 年 12 月以降) から Win2012R2 でコピーが成功した場合でも、ERROR_INVALID_PARAMETER を返します。Windows XP から Windows 7 まで、および Win 2k3 から Win2k8R2 まででは、これは発生せず、GetLastError は常に 0 (ERROR_SUCCESS) を返します。

これは、この種の Win32 API の予想される動作ですか? 結果を確認するために、結果と GetLastError コードの両方を追加する必要がありますか?

この KB は問題に関連しているようですが、このパッチを適用しても API の動作は変わりません。問題が発生する原因となった別の KB があった可能性がありますが、見つけることができませんでした https://support.microsoft.com/en-us/kb/2963918

GetLastError のドキュメント:

戻り値

戻り値は、呼び出しスレッドの最後のエラー コードです。

最後のエラー コードを設定する各関数のドキュメントの戻り値のセクションには、関数が最後のエラー コードを設定する条件が記載されています。スレッドの最終エラー コードを設定するほとんどの関数は、失敗したときにそれを設定します。ただし、一部の関数は、成功したときに最後のエラー コードも設定します。関数が最後のエラー コードを設定するように文書化されていない場合、この関数によって返される値は、設定された最新の最後のエラー コードです。 一部の関数は、成功時に最後のエラー コードを 0 に設定し、他の関数は設定しません。

4

1 に答える 1

3

ドキュメントから:

戻り値

関数が成功した場合、戻り値はゼロ以外です。

関数が失敗した場合、戻り値はゼロです。拡張エラー情報を取得するには、GetLastError を呼び出します。

つまり、関数が成功した場合、 を呼び出すことは期待されておらず、呼び出しGetLastErrorた場合に何が返されるかについては約束されていません。

したがって、意味を帰すGetLastErrorべきではない場所によって返される値に意味を帰しています。

これは Win32 でよくあるパターンです。非常に多くの機能が類似しています。によって返されるGetLastError値は、関数の戻り値が失敗を示している場合にのみ意味があります。ただし、これは普遍的なルールではないため、関数ごとにドキュメントを確認する必要があります。

このような Win32 関数の呼び出しの典型的な形式は次のようになります。

if (CopyFileEx(...))
{
    // function call succeeded, continue
}
else
{
    DWORD err = GetLastError();
    // do something with err
}

GetLastError関数が戻り値によって失敗を示した場合にのみ呼び出されることに注意してください。

于 2016-02-24T16:31:39.110 に答える