VS2005、Windows XPでの使用です。
下記のプログラムが一番最初にあります。
なぜか、InitApplicationの
return RegisterClassEx(&wcm);
までは流れますが、
その後は、戻りアドレスがないということで、
mainの方に戻れません。
ただのreturnにすると
戻れますが。
何が悪いのでしょうか?
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR IpCmdLine, int nCmdShow)
{
MSG msg;
if (!hPrevInstance)
if (!InitApplication(hInstance))
return 0;
:::::::::
:::::::::
}
BOOL InitApplication(HANDLE hInstance)
{
WNDCLASSEX wc, wcm;
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject
(WHITE_BRUSH);
wc.lpszMenuName = MainMenu;
wc.lpszClassName = MainClass;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&wc)) return FALSE;
wcm.cbSize = sizeof(wcm);
wcm.style = CS_HREDRAW | CS_VREDRAW;
wcm.lpfnWndProc = (WNDPROC)MainWndProc;
wcm.cbClsExtra = 0;
wcm.cbWndExtra = 0;
wcm.hInstance = hInstance;
wcm.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wcm.hCursor = LoadCursor(NULL, IDC_ARROW);
wcm.hbrBackground = (HBRUSH)GetStockObject
(WHITE_BRUSH);
wcm.lpszClassName = ImageClass;
wcm.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
return RegisterClassEx(&wcm);
}
どうやって実行してるんです?
F5で普通に実行してもそうなるのか、F11でステップ実行しているのか、とか。
なんとなく危険なにおいが...
バッファオーバーランとかしてませんでしょうか?
バッファオーバーランで、なぜ戻りアドレスが無くなるのかは、
以下のHPに詳しい解説があります。
https://www.ipa.go.jp/security/awareness/vendor/programming/b06.html
VC++2005なら、コンパイルオプション(リンクオプション?を変えていない
限り)、デバッグ版では実行時にバッファオーバーランチェックが走るはず
なので、一度、デバッグ版を実行して確認することをお勧めします。
う~んと。
だめもとで、呼び出し規約定義修飾まわりと山をかけて
1.WinMain()の APIENTRY を WINAPI に変えてみてください。
2.プロジェクトの「プロパティDLG」の「C/C++」の
「詳細」の「呼び出し規約」が「__cdecl(/Gd)」になっている
ことを確認してください。
関係なかったらごめんなさい。
みなさん
ありがとうございます。
みなさんのご提案では改善できなかったのですが、
えいやっで
if (!RegisterClassEx(&wc)) return FALSE;
wcm.cbSize = sizeof(wcm);
wcm.style = CS_HREDRAW | CS_VREDRAW;
wcm.lpfnWndProc = (WNDPROC)MainWndProc;
wcm.cbClsExtra = 0;
wcm.cbWndExtra = 0;
wcm.hInstance = hInstance;
wcm.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wcm.hCursor = LoadCursor(NULL, IDC_ARROW);
wcm.hbrBackground = (HBRUSH)GetStockObject
(WHITE_BRUSH);
wcm.lpszClassName = ImageClass;
wcm.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
return RegisterClassEx(&wcm);
のルーチンを外すと
うまくいくことになりました。
ありがとうございました。
なんか解決になっていないような気がしますけれど。
その部分がどうしてそこに書かれていて削るとどういう状況になるのかまで
理解して削っているのであれば、問題ないと思いますが、
意味が分からないまま、削ったのであれば今後の参考になら無いので
ちゃんと理解できるまで調べた方が良いですよ。
その辺の積み重ねって結構大事ですから。
>のルーチンを外すと
>うまくいくことになりました。
え゛。
それだとクラスMainClassも、クラスImageClassも
そのクラスのウインドウが作れなくなりませんでしたか(質問)。
っつ~か、CreateWindow()又はCreateWindowEx()等を
使ってなかったりするのでしょうか(vv;)。