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

Windows 如果从静态库调用Atl CDialogImpl,则不会在DoModal上显示,windows,winapi,visual-c++,atl,win32gui,Windows,Winapi,Visual C++,Atl,Win32gui,我在一个项目中编写了一个超级简单的ATL对话框。即使当我注意到web上的每个示例都实现了CDialogImpl类内联(即类定义及其实现,其中定义本身)时,我还是正常地编写了它,将我的定义分为.h文件和.cpp文件中的实现。本课程总结如下: CMainDialog.hpp 如果我从同一个项目中调用这个类,一切都会顺利。对话框显示。例如: 呼叫多莫达尔 因此,我将这个项目从.exe转换为静态库,并删除了tWinMain。 所以,如果我创建了一个新的ATL项目,请参考我新创建的库并调用CMainDia

我在一个项目中编写了一个超级简单的ATL对话框。即使当我注意到web上的每个示例都实现了CDialogImpl类内联(即类定义及其实现,其中定义本身)时,我还是正常地编写了它,将我的定义分为.h文件和.cpp文件中的实现。本课程总结如下:

CMainDialog.hpp 如果我从同一个项目中调用这个类,一切都会顺利。对话框显示。例如:

呼叫多莫达尔 因此,我将这个项目从
.exe
转换为
静态库
,并删除了tWinMain。 所以,如果我创建了一个新的ATL项目,请参考我新创建的库并调用CMainDialog.DoModal。。。嗯,什么也没发生。构造函数确实会被调用,但消息永远不会开始分派,程序以中间方式结束。也许我错过了什么


我对Win32编程完全陌生(虽然对c++来说肯定不是新手),因此希望您能提供帮助。

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

您应该尝试跟踪到DoModal以查看发生了什么。事实证明,.rc文件没有编译到静态库中。修复它就像将原始的.rc文件引用到我的.exe项目中一样简单。虽然感觉很脏,但我想这是win32的方式…我怀疑这一点。这是否意味着我必须使用库的.rc文件编译main exe?@Fabzter,或者将库的对话框复制到main的.rc中,但您必须同时小心地从resource.h中复制ID号,可能还需要重新编号。
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::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)
{
}
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;
}