如果从静态库调用,则不会在DoModal上显示Atl CDialogImpl

时间:2013-06-03 21:54:17

标签: windows winapi visual-c++ atl win32gui

我在一个项目中写了一个超级简单的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;
}

所以我将此项目从.exe转换为static library并删除了_tWinMain。 所以,如果我创建一个新的ATL项目,引用我新创建的库并调用CMainDialog.DoModal ......好吧,没有任何反应。构造函数确实被调用,但消息永远不会开始调度,程序也会以此方式结束。也许我错过了什么?

我对Win32编程完全不熟悉(虽然对c ++来说绝对不是新手)所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

静态库没有与之关联的资源。对话框代码很可能是尝试从程序资源加载对话框模板,但无法找到它。