3

プロジェクト内に非常に単純な ATL ダイアログを作成しました。Web 上のすべての例で CDialogImpl クラスがインラインで実装されていること (つまり、クラス定義と定義自体の実装) に気付いた場合でも、定義を .h ファイルに、実装を .cpp に分けて、通常どおりに記述しました。ファイル。このクラスを以下に要約します。

CMainDialog.hpp

class CMainDialog: public CDialogImpl<CMainDialog>
{
public:
    enum { IDD = IDD_MYDIALOGS_DIALOG};

    BEGIN_MSG_MAP(CMainDialog)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
    END_MSG_MAP()

    CMainDialog();
    ~CMainDialog();

    LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, 
        BOOL& bHandled);

    LRESULT OnCancel(UINT uMsg, WORD wID, HWND hWndCtl, BOOL& bHandled);
}

CMainDialog.cpp

CMainDialog::CMainDialog()
{
}
CMainDialog::~CMainDialog()
{
}
LRESULT CMainDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, 
    BOOL& bHandled)
{
}
LRESULT CMainDialog::OnCancel(UINT uMsg, WORD wID, HWND hWndCtl, 
                              BOOL& bHandled)
{
}

同じプロジェクトからこのクラスを呼び出すと、すべてうまくいきます。ダイアログが表示されます。例:

DoModal の呼び出し

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    CMainDialog dialog;
    dialog.DoModal();

    return 0;
}

そこで、このプロジェクトを_tWinMainに変換.exeして削除しました。static libraryしたがって、新しい ATL プロジェクトを作成し、新しく作成したライブラリを参照して CMainDialog.DoModal を呼び出しても、何も起こりません。コンストラクターは呼び出されますが、メッセージのディスパッチは開始されず、プログラムはすぐに終了します。多分私は何かを逃していますか?

私は Win32 プログラミングにまったく慣れていないので (ただし、c++ は初めてではありません)、どんな助けも歓迎します。

4

1 に答える 1

3

静的ライブラリには、リソースが関連付けられていません。ダイアログ コードがプログラム リソースからダイアログ テンプレートを読み込もうとしている可能性がありますが、それが見つかりません。

于 2013-06-03T22:01:18.417 に答える