关于如何编写动态链接库DLL中的导出类

要输出整个的类,对类使用_declspec(_dllexpot);要输出类的成员函数,则对该函数使用_declspec(_dllexport)。如:  
   
  class   AFX_EXT_CLASS   CTextDoc   :   public   CDocument  
  {  
  …  
  }  
   
  extern   "C"   AFX_EXT_API   void   WINAPI   InitMYDLL();  

 

简单的说:如果使用MFC的话,请在类声明前加AFX_EXT_DATA,这样在使用的时候,MFC会自动将AFX_EXT_DATA解析成__declspec(export)或__declspec(import)的,不需要你来关心。
    
    
  新建两个工程,其中一个是dll工程(我的示例程序中这个工程名为DllClass),另一个是测试和使用dll的工程(名字为DllClassTest)  
   
    
  注意点:  
  1.   Dll工程编译完成后,将.lib和.dll文件拷贝到测试和使用dll的工程的适当目录下(我的程序是release目录),然后将Dll工程中的导出类的头文件(以下简称头文件)拷贝到测试和使用dll的工程的适当目录下(在我的程序中是拷贝到此工程文件所在目录),然后把这个拷贝过来的头文件通过下面2和3进行修改。  
   
  2.   在Dll工程中的头文件使用的是   #define   DLLCLASS_API   __declspec(dllexport)   表示导出  
  在测试和使用dll的工程中的头文件使用的是   #define   DLLCLASS_API   __declspec(dllimport)   表示导入  
   
  3.   不论Dll工程的头文件如何实现(比如说包括内联函数等等),在测试和使用dll的工程中的头文件中全部都是声明而没有定义(即将类成员函数的实现部分去掉)  
   
  4。在测试和使用dll的工程的那个文件中包含对dll库的引入,分两步:  
   
  首先在是测试和使用dll的工程的setting菜单(按ALT+F7可以调出)中的LINK选项卡中的Object/Librarymodules:下填写对   dll   的连接,比如dll文件名字为DllClass.lib和DllClass.dll,则填写   ../Release/DllClass.lib(注意目录,我的程序中.lib文件是在目录release下)。  
  然后,添加对头文件的包含,比如dll文件名字为DllClass.lib和DllClass.dll,头文件为DllClass.h,则包含头文件为   #include   "DllClass.h"  
    
  由此,就可以使用了。  
   
  相关源码如下:  
   
  dll工程中的DllClass.h   内容:  
   
  //此处在dll的头文件中为   dllexport,在应用文件中为dllimport  
   
  #defineDLLCLASS_API__declspec(dllexport)  
   
  //导出一个类(包括其方法、属性)  
  classDLLCLASS_APICDllClass  
  {  
  public:  
  CDllClass(void);  
  voidMSG(constchar*conststr);  
  };  
   
  dll工程中的DllClass.cpp内容:  
  #include"stdafx.h"  
  #include"DllClass.h"  
   
  BOOL   APIENTRY   DllMain(HANDLE   hModule,DWORD   ul_reason_for_call,LPVOID   lpReserved)  
  {  
  switch(ul_reason_for_call)  
   {  
   case   DLL_PROCESS_ATTACH:  
   case   DLL_THREAD_ATTACH:  
   case   DLL_THREAD_DETACH:  
   case   DLL_PROCESS_DETACH:  
   break;  
  }  
  return   TRUE;  
  }  
   
   
  CDllClass::CDllClass()  
  {  
   return;  
  }  
   
  void   CDllClass::MSG(const   char*   const   str)  
  {  
  MessageBox(NULL,str,"",MB_OK);  
  }  
   
  Dll测试工程中的DllClass.h内容:  
   
  //此处在dll的头文件中为   dllexport,在应用文件中为dllimport  
  #define   DLLCLASS_API   __declspec(dllimport)  
   
  //导出一个类(包括其方法、属性)  
  class   DLLCLASS_API   CDllClass  
  {  
  public:  
   CDllClass(void);  
   void   MSG(const   char*   const   str);  
  };  
  Dll测试工程中DllClassTest.cpp内容:  
  首部:  
  #include   "DllClass.h"  
  class   DllClass;  
   
  代码部分:  
  CDllClass   CTest;  
  CTest.MSG("this   is   a   string   into   dll");

你可能感兴趣的:(VC编程)