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
}

 

 

 

你可能感兴趣的:(VC++)