实现目的:用户程序中调用DLL时,DLL创建一个对话框指针,然后在后台运行;
例子:
DLL(MFC扩展)文件:在APP里 CDcuDlg * pDlg;__declspec(dllexport) void _stdcall Show_DCUDialog( ) //导出函数
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
pDlg->ShowWindow( SW_NORMAL);}
BOOL CDCUApp::InitInstance() //DLL入口创建
{ pDlg = new CDcuDlg;
pDlg->Create( IDD_DCU );
pDlg->ShowWindow( SW_HIDE );
pDlg = pDCUdialog;
return CWinApp::InitInstance();
}int CDCUApp::ExitInstance()
{ pDlg->DestroyWindow();
delete pDlg;
return CWinApp::ExitInstance();
}
如果是对话框程序调用这个DLL ,pDlg可以正常被创建。但是单文档程序就不能初始化这个pDlg。
请问这一般错在哪里??
我也可以这样的方法建了一个DLL ,单文档程序也可以正常调用,其中DLL的创建方法是一样的,只是DLL里的对话框资源不一样 里面的成员及函数都不一样,请问我不能被初始化的那DLL问题一般在哪里??
例子:
DLL(MFC扩展)文件:在APP里 CDcuDlg * pDlg;__declspec(dllexport) void _stdcall Show_DCUDialog( ) //导出函数
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
pDlg->ShowWindow( SW_NORMAL);}
BOOL CDCUApp::InitInstance() //DLL入口创建
{ pDlg = new CDcuDlg;
pDlg->Create( IDD_DCU );
pDlg->ShowWindow( SW_HIDE );
pDlg = pDCUdialog;
return CWinApp::InitInstance();
}int CDCUApp::ExitInstance()
{ pDlg->DestroyWindow();
delete pDlg;
return CWinApp::ExitInstance();
}
如果是对话框程序调用这个DLL ,pDlg可以正常被创建。但是单文档程序就不能初始化这个pDlg。
请问这一般错在哪里??
我也可以这样的方法建了一个DLL ,单文档程序也可以正常调用,其中DLL的创建方法是一样的,只是DLL里的对话框资源不一样 里面的成员及函数都不一样,请问我不能被初始化的那DLL问题一般在哪里??
显然是我那DLL出现了问题,但不知道问题在哪里???
这句是什么意思?
{ pDlg = new CDcuDlg;
pDlg->Create( IDD_DCU );
pDlg->ShowWindow( SW_HIDE );
pDlg = pDCUdialog;
return CWinApp::InitInstance();
}这里用到对话框资源IDD_DCU,所以函数最前面也要加上AFX_MANAGE_STATE(AfxGetStaticModuleState());进行模块切换
我试过其他DLL APP里都是按这样创建的 都可以
但就是这个不可以,所以请大家帮忙找原因
AFX_MANAGE_STATE(AfxGetAppModuleState());
不好意思
#include "Resource.h"在欲编译的时候要让编译器 编译到 你的资源文件。
unhandled exception in Test.exe( NTDLL.DLL) 0XC0000005:Access Violation
如果有的话,需要包含有
CoInitialize(NULL);
AfxEnableControlContainer();
如果有richeditctrl之类的控件,如果有的话,需要在动态链接库的initinstance中添加初始化函数:
AfxInitRichEdit();
我也遇到这样的问题,就是这样解决的.
楼主,祝你好运了,呵呵.
CButton m_btnAtRec;
CButton m_btnHdRec;
CButton m_LnkBtn;
CListBox m_EvntLstBx;
CComboBox m_linktypecombo;
CComboBox m_portcombo;
CButton m_addbtn;
CButton m_cancelbtn;
CButton m_delbtn;
CButton m_mdfbtn;
CIPAddressCtrl m_dcuip;
CTreeCtrl m_ctrltree;
CString m_usernumstr;
CString m_portstr;
CString m_namestr;
其中成员中有个CSerialPort串口类请问要加什么宏?
CString m_portstr;
CString m_namestr;
用的是什么控件,edit?richedit?如果是后者,需要在对话框的构造函数中添加初始化函数:
AfxInitRichEdit();
class CMyDlg : public CDialog
{
// Construction
public:
CMyDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data
//{{AFX_DATA(CMyDlg)
enum { IDD = IDD_DIALOG1 };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL// Implementation
protected: // Generated message map functions
//{{AFX_MSG(CMyDlg)
afx_msg void OnButton1();
afx_msg void OnClose();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
: CDialog(CMyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlersvoid CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
AFX_MANAGE_STATE(AfxGetStaticModuleState());
AfxMessageBox("dkdkdk");
delete this;
}
__declspec(dllexport) void _stdcall Show_DCUDialog()//导出函数
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyDlg *pDlg = new CMyDlg;
pDlg->Create(IDD_DIALOG1);
pDlg->ShowWindow( SW_SHOW );
}void CMyDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDialog::OnClose();
delete this;
}
在单文档视图中的测试代码如下:__declspec(dllimport) void _stdcall Show_DCUDialog();void CFddView::OnEditTest()
{
// TODO: Add your command handler code here
Show_DCUDialog();
}
上次我重新写过一个DLL 也可以
还是谢谢大家