CreateWindowExで強制終了してしまいます。

解決


dee  2003-09-28 22:49:05  No: 52201  IP: [192.*.*.*]

WNDCLASS wclsDXForm;
  
  wclsDXForm.style= CS_HREDRAW | CS_VREDRAW;
  wclsDXForm.lpfnWndProc= DefWindowProc;
  wclsDXForm.cbClsExtra= wclsDXForm.cbWndExtra= 0;
  wclsDXForm.hInstance= hInstance;
  wclsDXForm.hIcon= LoadIcon(NULL , IDI_APPLICATION);
  wclsDXForm.hCursor= LoadCursor(NULL , IDC_ARROW);
  wclsDXForm.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
  wclsDXForm.lpszMenuName= NULL;
  wclsDXForm.lpszClassName= "DXForm";

  if(RegisterClass(&wclsDXForm)==0)Beep(0,0);

  hMainForm=CreateWindowEx(WS_EX_TOPMOST,"DXForm","Direct3D8",WS_POPUP,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);

こういうのを、hInstanceを引数にしてWinMainの外部から呼び出しているのですが、
CreateWindowExのところで、appが原因でapp.EXEにエラーが発生しました。
appは終了します。と強制終了されてしまいます。
戻り値はちゃんとNULL以外を返しております。
原因として心当たりのあるものがありましたら、お教えください
よろしく御願いいたします。

編集 削除
dee  2003-09-28 22:53:54  No: 52202  IP: [192.*.*.*]

コンパイラはBCC++5.5です。

Winmain関数のところでは
INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,INT nCmdShow){
  Start(hInstance);
  return 0;
}
として、
Start()関数のところで上に書いたコードを最初に行っています。

編集 削除
YuO  2003-09-29 00:11:41  No: 52203  IP: [192.*.*.*]

> CreateWindowExのところで、appが原因でapp.EXEにエラーが発生しました。
> appは終了します。と強制終了されてしまいます。

落ちたのは,本当にCreateWindowExなのですか?
であるとすると,

> 戻り値はちゃんとNULL以外を返しております。

と矛盾する気がするのですが。


ちゃんとデバッガ使って調べてみるとよいでしょう。

編集 削除
冬夜  2003-09-29 12:39:13  No: 52204  IP: [192.*.*.*]

CreateWindowEXは内部からWM_CREATEを呼び出しますので、
そのあたりかも知れません。

編集 削除
冬夜  2003-09-29 12:41:16  No: 52205  IP: [192.*.*.*]

あ、
>戻り値はちゃんとNULL以外を返しております。
でしたね。すいません。

YuOさんの仰る通り
ブレイクポイントを置く等して場所を特定するのが
先決かと思います。

編集 削除
dee  2003-09-29 22:14:20  No: 52206  IP: [192.*.*.*]

はい、Turbo Debuggerを使って調べてみました。
やっぱり、CreateWindowExでとまっています。
が、ちゃんとNULL以外の値を返していると書きましたが、
実際はCreateWindowExが値を返す前に止まっていて、
hMainFormの値は関数を呼び出す前と呼び出す後で変わっていませんでした。
ということで、CreateWindowExの関数の中でとまっているものと思われます。
まだ未解決です。よろしく御願いいたします。

編集 削除
YuO  2003-09-29 23:21:45  No: 52207  IP: [192.*.*.*]

う〜〜ん……。
手元でコード動かしても,とりあえず問題は起きていませんが……。

とりあえず,
LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
というようなコードで,uMsg, wParam, lParamの値をチェックしてみるとよいでしょう。

編集 削除
岡田 之仁  2003-09-30 08:25:57  No: 52208  IP: [192.*.*.*]

外れているかもしれませんが・・・
私が以前遭遇したこの手のエラーの場合、CreateWindowEx()で設定している
『WS_EX_TOPMOST』に問題がある可能性があります。

通常のウィンドウで生成してみて、後から、SetWindowPos()でHWND_TOPMOST
にされてみては・・・

ご検討下さい。

以上。

編集 削除
dee  2003-10-02 22:57:47  No: 52209  IP: [192.*.*.*]

申し訳ありません、CreateWindowExにはまったく問題がありませんでした。
ぜんぜん的外れでした。
ご迷惑おかけしました。

いろいろ返信してくださって有難うございました。

編集 削除