トップ回答者
デバッグエラーについて

質問
-
現在、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);
}
回答
-
Visual C++ 2010 Expressで試してみました。
例外が出た時に「中断」を押して、メニュー/デバッグ/ウィンドウ/呼び出し履歴 を表示させ、呼び出し履歴の一行目がRegisterClassExの呼び出しを示しているのがわかりました。
RegisterClassExの引数は &wc なので、wcのメンバーの設定に誤りがあるか、または、未設定のメンバーがあるか、お調べください。
-
snao さんと、かぶってる部分もありますが、WNDCLASSEXの設定が足りないように見えます。構造体の宣言を確認し、自身が記述している内容に足りないものを補う必要があります。
それから...この実装だと、最初の実行時エラーを修正しても、今度はアプリケーションが終了しない(ウィンドウを閉じてもメッセージループを抜けない)気がします。気がするだけで、今のWindowsは大丈夫なのかもしれませんが、それについてはわかりません。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
- 回答としてマーク 星 睦美 2013年7月29日 0:35
-
え~と
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);
}
すべての返信
-
Visual C++ 2010 Expressで試してみました。
例外が出た時に「中断」を押して、メニュー/デバッグ/ウィンドウ/呼び出し履歴 を表示させ、呼び出し履歴の一行目がRegisterClassExの呼び出しを示しているのがわかりました。
RegisterClassExの引数は &wc なので、wcのメンバーの設定に誤りがあるか、または、未設定のメンバーがあるか、お調べください。
-
snao さんと、かぶってる部分もありますが、WNDCLASSEXの設定が足りないように見えます。構造体の宣言を確認し、自身が記述している内容に足りないものを補う必要があります。
それから...この実装だと、最初の実行時エラーを修正しても、今度はアプリケーションが終了しない(ウィンドウを閉じてもメッセージループを抜けない)気がします。気がするだけで、今のWindowsは大丈夫なのかもしれませんが、それについてはわかりません。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
- 回答としてマーク 星 睦美 2013年7月29日 0:35
-
え~と
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);
}