[英]How to pass the pointer of main Dlg from a thread to a function inside in MFC
[英]MFC Fail to Load Dlg from DLL
我已經在我的PC VS2008和Windows Mobile 6 SDK中安裝了它。
我制作了一個SmartDevice MFC應用程序和一個Regular DLL MFC,它們都使用共享的MFC DLL。
但是,當我調用DLL的DoModal()時,應用程序掛起,顯示“ 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
}
DLL中的def文件; TesteDll.def:聲明DLL的模塊參數。
LIBRARY "TesteDll"
EXPORTS
; Explicit exports can go here
_Load @1
_Unload @2
_Run @3
在類似的問題中,我必須在DLL對話框的OnInitDialog,OnKillActive和OnSize方法中使用AFX_MANAGE_STATE
宏。 我只需要添加OnKillActive和OnSize方法就可以調用所提到的宏,除了調用宏然后執行基本操作並返回外,它們什么都不做。 也許它將適合您的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.