13

WinAPI の WriteFile (Microsoft Visual C++ 2008 Express でコンパイル) を使用する "Hello world" プログラムを次に示します。

int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t str[] = L"Hello world";

    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
    if(out && out!=INVALID_HANDLE_VALUE)
    {
        WriteFile(out, str, sizeof(str), NULL, NULL);
        CloseHandle(out);
    }   

    return 0;
}

コンソール ウィンドウで実行すると、喜んで世界に挨拶します。ただし、標準出力をリダイレクトしようとすると、

hello.exe > output.txt

プログラムが WriteFile でクラッシュします (NULL ポインター例外)。それにもかかわらず、output.txt は存在​​し、正しい出力全体が含まれています。

クラッシュ時のコール スタック:

KernelBase.dll!_WriteFile@20()  + 0x75 bytes    
kernel32.dll!_WriteFileImplementation@20()  + 0x4e bytes    
srgprc2.exe!wmain(int argc=1, wchar_t * * argv=0x00483d88)  Line 15 + 0x16 bytes    C++

メッセージ:「srgprc2.exe の 0x75ce85ea (KernelBase.dll) で未処理の例外: 0xC0000005: アクセス違反書き込み場所 0x00000000.」

何が起きてる?ありがとう!

4

2 に答える 2

19

4 番目のパラメータ toWriteFile はオプションではありません。許可されていない NULL を渡しています。

于 2011-11-19T17:16:13.753 に答える