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;

}