2017-07-14 9 views
1

最小限の例を引き起こすSTRING`:コンピレーション:: Windowsのエラーステータス

#include <Windows.h> 
#include <string> 
int main(int /*argc*/, char* /*argv*/[]) { 
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //Behavior the same, with or without. 
    DWORD err = GetLastError(); 
    std::string str; 
    return (int)err; //returns 127 iff line above uncommented, 0 iff commented 
} 

このプログラムは、( "指定したプロシージャが見つかりませんでした")ERROR_PROC_NOT_FOUNDに対応する、127を返します。 errに設定され、の前にstd::stringが作成されていることに注意してください。プログラムは、MSVC 2017でデバッグモードでコンパイルされます。

この動作は予期されていますか?そうでない場合は、いくつかの確認をすることができますか?(バグレポートを提出します)

+0

プロセス起動時にプロセスで最後に発生したエラーを想定しています。 – pm100

+0

実際に何かが文字列の構成に間違っていた場合は、例外または動的リンカーに失敗する可能性が非常に高くなります。 – cdhowie

+0

'std :: string str;'をコメントアウトすると、同じ値になりますか?また、毎回同じ価値がありますか? – NathanOliver

答えて

6

GetLastError()は、このスレッドによって呼び出されるWinAPI関数によって設定される最後のエラーコードを返します。 WinAPI関数は、成功したときにnot necessarilyコードを設定します。

ほとんどの関数は、失敗した場合にのみSetLastErrorまたはSetLastErrorExを呼び出します。

失敗したWinAPI関数は呼び出されていません。したがって、エラーコードは不確定です。これは初期化されていない(未定義の動作を意味する)か、未知の関数によって設定されています(わずかに無意味です)。標準ライブラリは、例外を使用してWindows APIではなくエラーを通知します。


"この動作が必要ですか?"

の値は、関数が適切なコンテキストで使用されていないために許容されるという意味での動作が期待されます。

+0

これは理にかなっています。しかし、 'GetLastError()'(editを参照)の呼び出しの前にWinAPI関数を追加しても問題は解決しません。 – imallett

+0

@memlett失敗した関数を試してみてください。成功した関数は必ずしもエラーコードを設定するとは限りません。 [link](https://msdn.microsoft.com/en-us/library/windows/desktop/ms680627(v = vs.85).aspx)から:*「ほとんどの関数は、失敗した場合にのみSetLastErrorまたはSetLastErrorExを呼び出します。 "*あなたはまた、あなたが望む任意の値であなた自身が' SetLastError'を呼び出すことができます。 –

+0

行を 'GetStdHandle(0)'に置き換えると、 'ERROR_INVALID_HANDLE'("ハンドルは無効です) "に戻ります。あなたの編集は理にかなっています。] – imallett

関連する問題