【问题标题】:MFC Fail to Load Dlg from DLLMFC 无法从 DLL 加载 Dlg
【发布时间】:2010-11-16 12:31:34
【问题描述】:

我已经在我的 PC 上安装了 VS2008 和 Windows Mobile 6 SDK。

我制作了一个 SmartDevice MFC 应用程序和一个 Regular DLL MFC,它们都使用共享的 MFC DLL。

但是当我调用 DLL 的 DoModal() 时,应用程序挂起,显示“调试断言失败”消息并冻结我的设备。

你能帮帮我吗?

代码:

EXE代码:

typedef BOOL  (CALLBACK* LPFNDLLLOAD)();
typedef BOOL  (CALLBACK* LPFNDLLRUN)(HINSTANCE, HWND, LPBYTE *, LONG *);

BOOL CTesteExeDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);         // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    //CModule mod;
    //mod.Create(L"\\Program Files\\PMA\\Teste.dll");
    //mod.Run(AfxGetInstanceHandle(), GetSafeHwnd(), 0, 0);

    HMODULE m_hModule = AfxLoadLibrary(L"\\Program Files\\PMA\\TesteDll.dll");
    LPFNDLLLOAD m_lpfnLoad= (LPFNDLLLOAD)GetProcAddress(m_hModule, _T("_Load"));
    LPFNDLLRUN  m_lpfnRun = (LPFNDLLRUN)GetProcAddress(m_hModule, _T("_Run"));

    m_lpfnLoad();
    m_lpfnRun(AfxGetInstanceHandle(), GetSafeHwnd(), 0, 0);

    return TRUE;  // return TRUE  unless you set the focus to a control
}

DLL 代码:

我删除了默认的 CTTesteDllApp 类并把这个:

#include "stdafx.h"
#include "TesteDll.h"
#include "TesteDllDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

extern "C" BOOL PASCAL EXPORT _Load()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    return TRUE;
}

extern "C" BOOL PASCAL EXPORT _Unload()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    return TRUE;
}

extern "C" BOOL WINAPI EXPORT _Run(HINSTANCE hInst,
                                   HWND hwndParent,
                                   LPBYTE *buffer,
                                   LONG *size)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    CTesteDllDlg d;
    d.DoModal(); ////-------------> Error Here

    return FALSE;
}

DLL Dlg 代码:

BOOL CTesteDllDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    AfxMessageBox(L"Oi");

    return TRUE;  // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}

DLL 中的 def 文件 ; TesteDll.def : 声明 DLL 的模块参数。

LIBRARY      "TesteDll"

EXPORTS
    ; Explicit exports can go here
    _Load           @1
    _Unload         @2
    _Run            @3

【问题讨论】:

  • 什么是断言失败?你能在这里打印消息吗?断言失败应该指向 MFC 源代码中的一些代码。看看这可能会有所帮助。

标签: c++ visual-studio visual-c++ dll mfc


【解决方案1】:

在类似的问题中,我不得不在 DLL 对话框的 OnInitDialog、OnKillActive 和 OnSize 方法中使用 AFX_MANAGE_STATE 宏。我不得不添加 OnKillActive 和 OnSize 方法只是为了调用提到的宏,它们除了调用宏,然后是基本实现,然后返回之外什么都不做。也许它适用于您的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 2017-06-26
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多