思路主要是提供导出类的方式,或者导出函数的方式。下面主要讲解导出类的方式。
一、导出类的方式是:
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
}