InitAppiicationから戻れない – プログラミング – Home

通知
すべてクリア

[解決済] InitAppiicationから戻れない


Init
 Init
(@Init)
ゲスト
結合: 16年前
投稿: 2
Topic starter  

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);
}


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

どうやって実行してるんです?
F5で普通に実行してもそうなるのか、F11でステップ実行しているのか、とか。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

なんとなく危険なにおいが...
バッファオーバーランとかしてませんでしょうか?

バッファオーバーランで、なぜ戻りアドレスが無くなるのかは、
以下のHPに詳しい解説があります。
https://www.ipa.go.jp/security/awareness/vendor/programming/b06.html

VC++2005なら、コンパイルオプション(リンクオプション?を変えていない
限り)、デバッグ版では実行時にバッファオーバーランチェックが走るはず
なので、一度、デバッグ版を実行して確認することをお勧めします。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

う~んと。
だめもとで、呼び出し規約定義修飾まわりと山をかけて

1.WinMain()の APIENTRY を WINAPI に変えてみてください。
2.プロジェクトの「プロパティDLG」の「C/C++」の
  「詳細」の「呼び出し規約」が「__cdecl(/Gd)」になっている
  ことを確認してください。

関係なかったらごめんなさい。


返信引用
Init
 Init
(@Init)
ゲスト
結合: 16年前
投稿: 2
Topic starter  

みなさん
ありがとうございます。
みなさんのご提案では改善できなかったのですが、
えいやっで
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);
のルーチンを外すと
うまくいくことになりました。
ありがとうございました。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

なんか解決になっていないような気がしますけれど。

その部分がどうしてそこに書かれていて削るとどういう状況になるのかまで
理解して削っているのであれば、問題ないと思いますが、
意味が分からないまま、削ったのであれば今後の参考になら無いので
ちゃんと理解できるまで調べた方が良いですよ。
その辺の積み重ねって結構大事ですから。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

>のルーチンを外すと
>うまくいくことになりました。

え゛。
それだとクラスMainClassも、クラスImageClassも
そのクラスのウインドウが作れなくなりませんでしたか(質問)。

っつ~か、CreateWindow()又はCreateWindowEx()等を
使ってなかったりするのでしょうか(vv;)。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました