1.       利用 MFC AppWizzed(DLL) 向导界面创建一个动态链接库工程 , 向导中的各个选项不变 .
2.       DLL 主程序文件中定义几个函数 , 供其他程序调用 , 函数的声明必须有下面的的关键字 :
             extern "C" TYPE PASCAL EXPORT FunName()
        每个函数体的第一句话必须是 :
            AFX_MANAGE_STATE(AfxGetStaticModuleState());
             如下例 :
                extern "C" int PASCAL EXPORT TestFun()<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

{
                       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;

}