1.       利用MFC AppWizzed(DLL)向导界面创建一个动态链接库工程,向导中的各个选项不变.
2.       DLL主程序文件中定义几个函数,供其他程序调用,函数的声明必须有下面的的关键字:
             extern "C" TYPE PASCAL EXPORT FunName()
        每个函数体的第一句话必须是:
            AFX_MANAGE_STATE(AfxGetStaticModuleState());
             如下例:
                extern "C" int PASCAL EXPORT TestFun()
{
                       AFX_MANAGE_STATE(AfxGetStaticModuleState());
 
                      return 8;
}
 
 
3.       每个显式调用的动态链接库工程都必须包含一个模块定义文件,DEF文件,在模块定义文件中必须对外部调用者说明库内函数的名称,书写格式如下:
 TestFun    @1
:
; S12.def : Declares the module parameters for the DLL.
 
LIBRARY      "S12"
DESCRIPTION  'S12 Windows Dynamic Link Library'
 
EXPORTS
    ; Explicit exports can go here
 
TestFun @1
如果有多个函数,则编号从@1开始,不要从@0开始.
调用:
显式调用的动态链接库必须使用LoadLibrary()函数装载,因此叫做显式调用.
1.       MFC AppWizzed(exe)向导界面创建一个普通的project
2.       在实施调用的CPP文件的顶部定义函数指针类型,定义方法:
        typedef TYPE (CALLBACK* FUNPOINTER1)(param list);
     
3.       在调用点声明函数指针,声明方法:
       FUNPOINTER1 lpfnDllFunc1;
4.       LoadLibrary()装载动态链接库.
5.       GetProcAddress()装载函数,装载方法;
lpfnDllFunc1 = (FUNPOINTER1)GetProcAddress(“TestFun”);
6.       调用装载进来的函数:
   lpfnDllFunc1();
   :
     BOOL CTestDllApp::TestDll()
{
       HINSTANCE hDll;
       FUNPOINTER1 lpfnDllFunc1;
       FUNPOINTER2 lpfnDllFunc2;
      
       UINT uReturnVal;
      
       hDll = LoadLibrary("E:\\S12.dll");//装载动态连接库
      
       if(hDll != NULL)
       {
              lpfnDllFunc1 = (FUNPOINTER1)GetProcAddress(hDll,"TestFun");//装载函数
              if(!lpfnDllFunc1)
              {
                     FreeLibrary(hDll);
                     return FALSE;
              }
              else
              {
                     int n;
            n = lpfnDllFunc1();//调用函数
            }           
       }
       return TRUE;
}