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

标签 windows winapi visual-c++ atl win32gui

我在项目中写了一个 super 简单的 ATL 对话框。即使我注意到网络上的每个示例都内联实现了 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++ 绝对不是新手)所以任何帮助将不胜感激。

最佳答案

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

关于windows - 如果从静态库调用,Atl CDialogImpl 不会显示在 DoModal 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16906476/

相关文章:

c# - Windows Azure 持久存储技巧

windows - 使用 NAnt 在构建脚本中安装/卸载 Windows 服务

c++ - 代码分析说 Inconsistent annotation for 'wWinMain' : this instance has no annotations

visual-studio - Visual Studio不允许我使用某些变量名

c++ - 仅消息窗口中的线程泵消息

c++ - windows编程如何让 "choose file"函数生效?

c++ - 部分透明窗口 OpenGL/Win32

delphi - 如何在 Delphi 中提高 TCP 数据包的优先级?

winapi - 是否有注册表记录哪些 Windows 函数返回哪些错误代码?

c++ - 终止 unicode 空字符