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以外を返しております。
原因として心当たりのあるものがありましたら、お教えください
よろしく御願いいたします。
コンパイラはBCC++5.5です。
Winmain関数のところでは
INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,INT nCmdShow){
Start(hInstance);
return 0;
}
として、
Start()関数のところで上に書いたコードを最初に行っています。
> CreateWindowExのところで、appが原因でapp.EXEにエラーが発生しました。
> appは終了します。と強制終了されてしまいます。
落ちたのは,本当にCreateWindowExなのですか?
であるとすると,
> 戻り値はちゃんとNULL以外を返しております。
と矛盾する気がするのですが。
ちゃんとデバッガ使って調べてみるとよいでしょう。
CreateWindowEXは内部からWM_CREATEを呼び出しますので、
そのあたりかも知れません。
あ、
>戻り値はちゃんとNULL以外を返しております。
でしたね。すいません。
YuOさんの仰る通り
ブレイクポイントを置く等して場所を特定するのが
先決かと思います。
はい、Turbo Debuggerを使って調べてみました。
やっぱり、CreateWindowExでとまっています。
が、ちゃんとNULL以外の値を返していると書きましたが、
実際はCreateWindowExが値を返す前に止まっていて、
hMainFormの値は関数を呼び出す前と呼び出す後で変わっていませんでした。
ということで、CreateWindowExの関数の中でとまっているものと思われます。
まだ未解決です。よろしく御願いいたします。
う〜〜ん……。
手元でコード動かしても,とりあえず問題は起きていませんが……。
とりあえず,
LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
というようなコードで,uMsg, wParam, lParamの値をチェックしてみるとよいでしょう。
外れているかもしれませんが・・・
私が以前遭遇したこの手のエラーの場合、CreateWindowEx()で設定している
『WS_EX_TOPMOST』に問題がある可能性があります。
通常のウィンドウで生成してみて、後から、SetWindowPos()でHWND_TOPMOST
にされてみては・・・
ご検討下さい。
以上。
申し訳ありません、CreateWindowExにはまったく問題がありませんでした。
ぜんぜん的外れでした。
ご迷惑おかけしました。
いろいろ返信してくださって有難うございました。