none
デバッグエラーについて RRS feed

  • 質問

  • 現在、C++で視覚暗号のウィンドウ画面を作成しているのですが、デバッグしたら

    「sian.exe の 0x774a15ee でハンドルされていない例外が発生しました: 0x00000000: この操作を正しく終了しました。」

    と表示されました。どうすればいいか分かりません。色々試行錯誤したのですが、この文章がいつも出ます。アドバイスお願いします。

    以下がプログラムソースです。

    #include<windows.h>
    #include<tchar.h>
    #include<stdio.h>
    #include<stdlib.h>


    #define WINDOW_WIDTH (315)
    #define WINDOW_HEIGHT (315)
    #define WINDOW_X 0
    #define WINDOW_Y 0

    #define show


    HWND Create(HINSTANCE hInst);
    LRESULT CALLBACK WndProc(HWND hWnd, UINT nsg,WPARAM wp,LPARAM lp);


    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
    {


     HWND hWnd;
     MSG msg;
     
     hWnd=Create(hInst);
     if(hWnd==NULL)
     {
      MessageBox(NULL,_T("ウィンドウの作成に失敗しました"),_T("エラー"),MB_OK);
      return 1;
     }

     ShowWindow(hWnd,SW_SHOW);
     UpdateWindow(hWnd);


     while(1)
     {
      BOOL ret=GetMessage(&msg,NULL,0,0);
      if(ret==0 || ret==-1)
      {
       break;
      }
      else
      {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
      }
     }

     return 0;

    }


    HWND Create(HINSTANCE hInst)
    {
     WNDCLASSEX wc;

     

     wc.cbSize=sizeof(wc);
     wc.style=CS_HREDRAW |CS_VREDRAW | CS_DBLCLKS;
     wc.lpfnWndProc=WndProc;
     wc.cbClsExtra=0;
     wc.cbWndExtra=0;
     wc.hInstance=hInst;
     wc.hIcon=(HICON)LoadImage(
      NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,
      0,0,LR_DEFAULTSIZE | LR_SHARED);

            wc.hIconSm=wc.hIcon;
      wc.hCursor=(HCURSOR)LoadImage(
       NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,
       0,0,LR_DEFAULTSIZE | LR_SHARED

       );
    wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName=NULL;
    if(RegisterClassEx(&wc)==0){return NULL;}

      return CreateWindow(
       wc.lpszClassName,
       _T("視覚暗号"),

       WS_OVERLAPPEDWINDOW,
       WINDOW_X,
       WINDOW_Y,
       WINDOW_WIDTH,
       WINDOW_HEIGHT,
       NULL,
       NULL,
       hInst,
       NULL

       );

    }

    LRESULT CALLBACK WndProc(HWND hWnd,UINT nsg, WPARAM wp,LPARAM lp)
    {
    return DefWindowProc(hWnd, nsg, wp, lp);
    }

    2013年7月16日 2:41

回答

  • Visual C++ 2010 Expressで試してみました。

    例外が出た時に「中断」を押して、メニュー/デバッグ/ウィンドウ/呼び出し履歴 を表示させ、呼び出し履歴の一行目がRegisterClassExの呼び出しを示しているのがわかりました。

    RegisterClassExの引数は &wc なので、wcのメンバーの設定に誤りがあるか、または、未設定のメンバーがあるか、お調べください。


    • 編集済み snao 2013年7月16日 7:25 RegisterClass-->ResigerClassEx
    • 回答の候補に設定 星 睦美 2013年7月19日 4:55
    • 回答としてマーク 星 睦美 2013年7月29日 0:35
    2013年7月16日 5:05
  • snao さんと、かぶってる部分もありますが、WNDCLASSEXの設定が足りないように見えます。構造体の宣言を確認し、自身が記述している内容に足りないものを補う必要があります。

    それから...この実装だと、最初の実行時エラーを修正しても、今度はアプリケーションが終了しない(ウィンドウを閉じてもメッセージループを抜けない)気がします。気がするだけで、今のWindowsは大丈夫なのかもしれませんが、それについてはわかりません。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク 星 睦美 2013年7月29日 0:35
    2013年7月16日 6:19
  • え~と

    wc.lpszClassName

    が未設定ですよね。クラス名称はキーであり、必須項目ですね。

    wc.lpszClassName = L"MyWndClassName"; // クラス名称

    の様に設定してみましょう。

    あと、どこのサンプルを参考にしたのか知りませんが、
    WM_DESTROYには応答しないとアプリケーションが終了しないのではないですか。
    以下を参考にしてください。

    LRESULT CALLBACK WndProc(HWND hWnd,UINT nsg, WPARAM wp,LPARAM lp)
    {
      switch( nsg){
      case WM_DESTROY:
        ::PostQuitMessage( 0); //終了を許諾 C++でしたよね!
        return 0; // break;でも可
      }
      return DefWindowProc(hWnd, nsg, wp, lp);
    }

    2013年7月16日 9:11

すべての返信

  • Visual C++ 2010 Expressで試してみました。

    例外が出た時に「中断」を押して、メニュー/デバッグ/ウィンドウ/呼び出し履歴 を表示させ、呼び出し履歴の一行目がRegisterClassExの呼び出しを示しているのがわかりました。

    RegisterClassExの引数は &wc なので、wcのメンバーの設定に誤りがあるか、または、未設定のメンバーがあるか、お調べください。


    • 編集済み snao 2013年7月16日 7:25 RegisterClass-->ResigerClassEx
    • 回答の候補に設定 星 睦美 2013年7月19日 4:55
    • 回答としてマーク 星 睦美 2013年7月29日 0:35
    2013年7月16日 5:05
  • snao さんと、かぶってる部分もありますが、WNDCLASSEXの設定が足りないように見えます。構造体の宣言を確認し、自身が記述している内容に足りないものを補う必要があります。

    それから...この実装だと、最初の実行時エラーを修正しても、今度はアプリケーションが終了しない(ウィンドウを閉じてもメッセージループを抜けない)気がします。気がするだけで、今のWindowsは大丈夫なのかもしれませんが、それについてはわかりません。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク 星 睦美 2013年7月29日 0:35
    2013年7月16日 6:19
  • え~と

    wc.lpszClassName

    が未設定ですよね。クラス名称はキーであり、必須項目ですね。

    wc.lpszClassName = L"MyWndClassName"; // クラス名称

    の様に設定してみましょう。

    あと、どこのサンプルを参考にしたのか知りませんが、
    WM_DESTROYには応答しないとアプリケーションが終了しないのではないですか。
    以下を参考にしてください。

    LRESULT CALLBACK WndProc(HWND hWnd,UINT nsg, WPARAM wp,LPARAM lp)
    {
      switch( nsg){
      case WM_DESTROY:
        ::PostQuitMessage( 0); //終了を許諾 C++でしたよね!
        return 0; // break;でも可
      }
      return DefWindowProc(hWnd, nsg, wp, lp);
    }

    2013年7月16日 9:11
  • フォーラム オペレーターの星 睦美です。

    emerald111 さんの質問にコミュニティのユーザーからの回答があります。
    回答の内容を確認いただいて、ひきつづき質問がありましたら返信をお願いします。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年7月23日 7:48