MFC如何写资源封装的DLL?

思路主要是提供导出类的方式,或者导出函数的方式。下面主要讲解导出类的方式。

一、导出类的方式是:

1 其中ShowDlg()函数在内部实现了对话框的封装,为了测试简单,可在对话框中加入一按钮,写上“Hello,world”的提示框。主要代码如下:

#ifdef _USRDLL
class __declspec(dllexport) CExportClass
#else
class __declspec(dllimport) CExportClass
#endif
{
public:
    CExportClass();
    ~CExportClass();

private:
    

public:
    void ShowDlg();
};

#ifdef _USRDLL
_declspec(dllexport) CExportClass ExportClass;
#else
_declspec(dllimport) CExportClass ExportClass;
#endif

2 #ifdef _USRDLL
__declspec(dllexport) CExportClass ExportClass;
#else
__declspec(dllimport) CExportClass ExportClass;
#endif

这段代码是导出类的对象,供调用者直接使用。

3 void CExportClass::ShowDlg()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    m_MyDlg.DoModal();
}

上面代码中在显示对话框之前一定要加上 AFX_MANAGE_STATE(AfxGetStaticModuleState());这句话,不然对话框显示不出来。

这句话意思是将当前模块切换到Dll模块中,因为对话框资源在DLL模块中定义。关键字搜索MFC源程序中有明确定义,如下:

AFX_MAINTAIN_STATE2::AFX_MAINTAIN_STATE2(AFX_MODULE_STATE* pNewState) throw()
{
    pNewState; // to make the compiler happy...
#ifdef _AFXDLL
    m_pThreadState = _afxThreadState.GetData();
    ASSERT(m_pThreadState);

    if(m_pThreadState)
    {
        m_pPrevModuleState = m_pThreadState->m_pModuleState;
        m_pThreadState->m_pModuleState = pNewState;
    }
    else
    {
        // This is a very bad state; we have no good way to report the error at this moment
        // since exceptions from here are not expected
        m_pPrevModuleState=NULL;
        m_pThreadState=NULL;
    }
#endif
}

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值