dll导出类

说明 功能赞助:ctrl+c 然后再ctrl+v

---------------------------------------------------

关于导出类 (DLL)  资源中有Demo
   
  要输出整个的类,对类使用_declspec(_dllexpot);要输出类的成员函数,则对该函数使用_declspec(_dllexport)。如:  
   
  class   AFX_EXT_CLASS   CTextDoc    public   CDocument  
  
  …  
  
   
  extern   "C"   AFX_EXT_API   void   WINAPI   InitMYDLL();  
   
   
  新建两个工程,其中一个是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    string   into   dll");

==================================================================================

VC动态链接库的分类
  Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
      非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;
      MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;
      MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。

静态链接库
在VC++6.0中new一个名称为libTest的static library工程,并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下:

//文件:lib.h
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y);   //声明为C编译、连接方式的外部函数
#endif

//文件:lib.cpp
#include "lib.h"
int add(int x,int y)
{
return x + y;
}


  编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。

  标准Turbo C2.0中的C库函数(我们用来的scanf、printf、memcpy、strcpy等)就来自这种静态库。

下面来看看怎么使用这个库,在libTest工程所在的工作区内new一个libCall工程。libCall工程仅包含一个main.cpp文件,它演示了静态链接库的调用方法,其源代码如下:

 

#include <stdio.h>
#include "..\lib.h"
#pragma comment( lib, "..\\debug\\libTest.lib" )  //指定与静态库一起连接
int main(int argc, char* argv[])
{
printf( "2 + 3 = %d", add( 2, 3 ) );
}

=====================================================

 

以上两个在一起就可以搞定了DLL导出类的全部过程,我也通过上面的两个例子得到了解决的问题。

同时发现在DLL不能导出类的变量。所以这个要声明为全局变量再调用,可以达到相同的目的。

 

------------------ 莫问出处 --------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值