MFC не удалось загрузить Dlg из DLL - PullRequest
0 голосов
/ 04 августа 2009

Я установил в свой ПК VS2008 и Windows Mobile 6 SDK.

Я сделал приложение SmartDevice MFC и обычную DLL MFC, обе используют совместно используемую MFC DLL.

Но когда я вызвал DoModal () из DLL, приложение зависает, показывает сообщение «Debug Assertion Failed» и останавливает устройство.

Вы можете мне помочь?

Коды:

Код 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:

Я удаляю класс CTesteDllApp по умолчанию и помещаю это:

#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
}

Файл def в DLL ; TesteDll.def: объявляет параметры модуля для DLL.

LIBRARY      "TesteDll"

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

1 Ответ

1 голос
/ 18 сентября 2009

В аналогичной проблеме мне пришлось использовать макрос AFX_MANAGE_STATE в методах OnInitDialog, OnKillActive и OnSize диалогового окна DLL. Мне пришлось добавить методы OnKillActive и OnSize только для вызова упомянутого макроса, они ничего не делают, кроме как для вызова макроса, затем базовой реализации и возврата. Может быть, это будет работать для вашего случая.

...