19175


使用OSはWindows10、症状はタイトルの通りです。  
WIN32アプリケーションで、デバッグ目的でコンソールの表示、文字出力の処理を作りました。

が、ランタイムエラーがデバッグ実行した時のみ出ます。ランタイムエラーが出るタイミングはWinMain()を抜けたあとのext_common.inlの273行目、

[code]

     exit(main_result);
    
[/code]

です。ランタイムエラーの内容は、

[code]

    0xC0000008: An invalid handle was specified
    
[/code]

となっています。以下ソースコードです。

[code]

    #include<io.h>
    #include<iostream>
    #include<fcntl.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        int hConsole;
        FILE* pFile;
    
        if( AllocConsole() )
        {
            hConsole = _open_osfhandle( (long)GetStdHandle(STD_OUTPUT_HANDLE), _O_WTEXT);
            pFile = _fdopen(hConsole, "w");
            freopen_s( &pFile, "CONOUT$", "w", stdout);
        }
    
        std::cout << "aaa" << std::endl;
    
        FreeConsole();
        return 0;
    }
    
[/code]

最後のFreeConsole()を呼ばなければエラーは出ません。  
じゃあFreeConsole()呼ばなければいいという話なのですが、それは片付けをしていないので、それもどうなのかなという感じです。

デバッグ実行時にしか出ないので、デバッグ実行時はFreeConsole()か、それに該当する処理が勝手に走るということなのでしょうか？  
よろしくお願いします。


CC BY-SA 3.0
2015-11-22T17:09:55.157
19174
2015-11-22T19:21:10.470
7499
question
c++ winapi
WIN32アプリケーションプログラムでコンソール使うとランタイムエラーが出る


解決策を一つ書きます。  
上記のコードにはAllocConsole()で表示する2つの方法が混じって使われています。  
ですが、それがエラーの本質的な原因ではありません。  
ひとまずは下記コードで問題なく動くかと思われます。

[code]

    #include <io.h>
    #include <iostream>
    #include <fcntl.h>
    #include <Windows.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        //int hConsole;   // DEL
        FILE* pFile;
    
        if (AllocConsole())
        {
            //hConsole = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_WTEXT);   // DEL
            //pFile = _fdopen(hConsole, "w");   // DEL
            freopen_s(&pFile, "CONOUT$", "w", stdout);
        }
    
        std::cout << "aaa" << std::endl;
        // Add Start
        Sleep(1000);  // DEBUG
        if (pFile != NULL)
        {
            fclose(pFile);
        }
        // Add End 
        FreeConsole();
        return 0;
    }
    
[/code]

しかし、_open_osfhandleを用いた方法ではご質問と同様のエラーが発生し、  
解決策がわかりませんでした。

参考リンク  
<https://stackoverflow.com/questions/9020790/using-stdin-with-an-allocconsole>


CC BY-SA 3.0
2015-11-22T19:21:10.470
19175
2015-11-22T19:21:10.470
2017-05-23T12:38:55.250
-1
7744
19174
answer