DLL专题之MFC规则库和扩展库

来源:互联网 发布:python zip 编辑:程序博客网 时间:2024/04/28 09:12

说实话,编写MFC规则库和扩展库和编写其他库没有什么区别.其实都一样.只不过, MFC规则库和扩展库对支持MFC的特性更好,你在写MFC规则库和扩展库的时候基本上可以和你写MFC应用程序一样.

那我们就随便写写吧.

首先建立一个MFC扩展的库吧.在这里我们导出一个函数调用前面的MFC静态苦的导出函数:

extern "C" __declspec(dllexport) void ShowDialog()
{
 typedef void ( *lpShowDialog)( );           //DLL里的函数原型
 
 HINSTANCE hInst = NULL;              //DLL的实例句柄,在WIN32中HINSTANCE和HMODULE可以互换使用
 lpShowDialog ShowDialog;             //函数定义

 hInst = LoadLibrary( "..//MFCStatic//Debug//MFCStatic.dll" );   //导入DLL
 if ( !hInst ) return ;
 ShowDialog = (lpShowDialog)GetProcAddress( hInst, "ShowDialog" );
 if ( ShowDialog )
 {
  ShowDialog( );               //调用DLL里的函数
 }
 FreeLibrary( hInst );             //释放DLL
}

我们再建立一个MFC规则库,在这里我们在调用刚才建立的MFC扩展库的导出函数.

实现文件代码如下:

int CMFCDllApp::ExitInstance()
{
 // TODO: Add your specialized code here and/or call the base class
 //释放资源...
 return CWinApp::ExitInstance();
}

BOOL CMFCDllApp::InitInstance()
{
 // TODO: Add your specialized code here and/or call the base class
 /*---------------------------------*/
 一般我们在这里完成一些必要的初始化工
 作。
 /*---------------------------------*/
 
 //AfxEnableControlContainer(); //允许你使用一MFC写的控件(ActiveX)
 
 /*-----------------------------------------------------*/
 if ( !AfxSocketInit() )
 {
 AfxMessageBox( _T(" 初始化SOCKET环境失败!") );
 return FALSE;
 }
 /*-----------------------------------------------------*/

 /*-----------------------------------------------------*/
 if ( !AfxOleInit() )
 {
  AfxMessageBox( _T(" 初始化组件库失败!") );
  return FALSE;
 }
 /*-----------------------------------------------------*/
 //....
 return CWinApp::InitInstance();
}

extern "C" __declspec(dllexport) void ShowDialog()
{
 typedef void ( *lpShowDialog)( );           //DLL里的函数原型
 
 HINSTANCE hInst = NULL;              //DLL的实例句柄,在WIN32中HINSTANCE和HMODULE可以互换使用
 lpShowDialog ShowDialog;             //函数定义
 
 hInst = LoadLibrary( "..//MFCEDll//Debug//MFCEDll.dll" );    //导入DLL
 if ( !hInst ) return ;
 ShowDialog = (lpShowDialog)GetProcAddress( hInst, "ShowDialog" );
 if ( ShowDialog )
 {
  ShowDialog( );               //调用DLL里的函数
 }
 FreeLibrary( hInst );             //释放DLL
}

最后,我们试着在外部调用他们:

void CDllDlg::OnBtnMfcdll()
{
 // TODO: Add your control notification handler code here
 typedef void ( *lpShowDialog)( );           //DLL里的函数原型
 
 HINSTANCE hInst = NULL;              //DLL的实例句柄,在WIN32中HINSTANCE和HMODULE可以互换使用
 lpShowDialog ShowDialog;             //函数定义
 
 hInst = AfxLoadLibrary( ".//MFCDll//Debug//MFCDll.dll" );     //导入DLL
 if ( !hInst ) return ;
 ShowDialog = (lpShowDialog)GetProcAddress( hInst, "ShowDialog" );
 if ( ShowDialog )
 {
  ShowDialog( );               //调用DLL里的函数
 }
 AfxFreeLibrary( hInst );             //释放DLL
}

void CDllDlg::OnBtnMfcedll()
{
 // TODO: Add your control notification handler code here
 typedef void ( *lpShowDialog)( );           //DLL里的函数原型
 
 HINSTANCE hInst = NULL;              //DLL的实例句柄,在WIN32中HINSTANCE和HMODULE可以互换使用
 lpShowDialog ShowDialog;             //函数定义
 
 hInst = AfxLoadLibrary( "..//MFCEDll//Debug//MFCEDll.dll" );    //导入DLL
 if ( !hInst ) return ;
 ShowDialog = (lpShowDialog)GetProcAddress( hInst, "ShowDialog" );
 if ( ShowDialog )
 {
  ShowDialog( );               //调用DLL里的函数
 }
 AfxFreeLibrary( hInst );             //释放DLL
}

到这里基本上DLL都写完了.不过一些基本理论并没有讲,自己查资料嘛!