0

SDK 7.1 を使用して win32 アプリケーションを構築したいと考えています。Visual C++ 2012 リソース エディターを使用してダイアログ ボックスを作成し、resource.rc と resource.h を自分のフォルダーにコピーして、次の単純な main.cpp ファイルを作成します。

#include <windowsx.h>
#include <Windows.h>
#include <tchar.h>

#include "resource.h"

#define my_PROCESS_MESSAGE(hWnd, message, fn)   \
    case(message):  \
        return( \
            SetDlgMsgResult(hWnd, uMsg, \
                HANDLE_##message((hWnd), (wParam), (lParam), (fn)) ))   \

LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
BOOL Cls_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam);
void Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);

int WINAPI _tWinMain(   HINSTANCE   hInstance,
                        HINSTANCE,
                        LPTSTR,
                        int         iCmdLine    )
{
    DialogBoxParam(     hInstance,
                        MAKEINTRESOURCE(IDD_INJECTOR),
                        NULL,
                        (DLGPROC) DlgProc,
                        NULL
                        );

    return FALSE;
}

LRESULT CALLBACK DlgProc(   HWND    hwnd,
                            UINT    uMsg,
                            WPARAM  wParam,
                            LPARAM  lParam  )
{
    switch (uMsg)
    {
        my_PROCESS_MESSAGE(hwnd, WM_INITDIALOG, Cls_OnInitDialog);
        my_PROCESS_MESSAGE(hwnd, WM_COMMAND, Cls_OnCommand);

    default:
        break;
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}


BOOL Cls_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    return TRUE;
}

void Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
    case IDCANCEL:
        EndDialog(hwnd, id);
        break;

    default:
        break;
    }
}

次に、次のコマンド ラインを使用して、このフォーラムで見つけたコードをコンパイルします。

cl main.cpp /link /SUBSYSTEM:WINDOWS user32.lib

私の問題は、ダイアログ ボックスが表示されなかったことです。procexp を使用して何が起こるかを確認すると、アプリケーションが作成されてから同時に閉じられることがわかりました。 C++ 2012.

私のSDK 7.1は正しくインストールされており、リソースファイルなしで基本的なウィンドウに対してテストしています

4

2 に答える 2

0

これはあなただけの問題ではありませんが、MSDNから:

ダイアログ ボックス プロシージャはウィンドウ プロシージャに似ていますが、DefWindowProc 関数を呼び出して不要なメッセージを処理することはできません。不要なメッセージは、ダイアログ ボックス ウィンドウ プロシージャによって内部的に処理されます。

【強調追加】

于 2013-10-17T19:43:02.363 に答える