首先使用Wizard创建一个Win32 Dynamic-Link Library工程,然后定义一个简单的C++类CInDLL.由于该类会被工程之外的文件所引用,所以需要对这个类进行引出。因为只有引出后所生成的DLL中才带有供足够的信息以在连接和运行时被正确引入到进程空间中。有两种方法可以引出类,使用__declspec(dllexport)定义和使用定义文件。

  下面先讲使用__declspec(dllexport)的方法:将类定义改为:class __declspec(dllexport) CInDLL 就可以了。 这样产生的工程在编译时是正确的但是在使用时会产生错误,因为你包含的头文件中也是使用__declspec(dllexport),而使用这个DLL的工程中并没有引出这个类,而是需要引入这个类)在使用时需要将类定义改为class __declspec(dllimport) CInDLL就可以了。

  使用定义文件可以有效的避免这个问题, 这种方法是利用宏定义在不同的地方产生不同的编译代码:

  在头文件中加入如下的代码:

  #ifndef ClassInDLL_H

#define ClassInDLL_H

#ifdef _CLASSINDLL

  #define CLASSINDLL_CLASS_DECL __declspec(dllexport)

  #else

  #define CLASSINDLL_CLASS_DECL __declspec(dllimport)

  #endif

  #endif // ClassInDLL_H

  //将class __declspec(dllexport) CInDLL改为

class CLASSINDLL_CLASS_DECL CInDLL

  {

  CInDLL()

  ……

  }

  在实现这个类的CPP文件的顶部加入#define _CLASSINDLL语句,然后include头文件。

  #define _CLASSINDLL

#include "CInDLL.h"

CInDLL::CInDLL(){}……

  这样一来在使用这个类时就可以不做任何改动了。

在使用这个类的工程中添加这个类的头文件,并设置或者动态链接.lib文件。

linux C++ 共享库导出类

1.共享库的对外接口函数的声明必须加上extern “C”。

2.使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误。

以下是一个插件式设计的示例:

1、主执行程序:main.cpp

#include

#include

#include "SMSGamePlugin.h"

int main(int argc, char** argv)

{

void *GameLib = dlopen("./Flower.so", RTLD_LAZY);

const char *dlError = dlerror();

if (dlError)

{

< "dlopen error!" << dlError <<

return(-1);

}

CSMSGamePlugin *(*pGetGameObject)(void);

pGetGameObject = (CSMSGamePlugin *(*)(void))dlsym(GameLib, "GetGameObject");

dlError = dlerror();

if (dlError)

{

< "dlsym error!" << dlError <<

return(-1);

}

CSMSGamePlugin *pGame = (*pGetGameObject)();

pGame->Initialize();

pGame->Load();

pGame->Handle();

delete *pGame;

dlclose(GameLib);

}

2、公用基类部分:SMSGamePlugin.h

#ifndef __SMSGamePlugin_h__

#define __SMSGamePlugin_h

class CSMSGamePlugin

{

public:

virtual int Initialize(void) = 0;

virtual int Load(void) = 0;

virtual int Handle(void) = 0;

};

#endif

编译:g++ -rdynamic -ldl -s -o Test main.cpp

3、共享库部分:

共享库头文件:Flower.h

#ifndef __Flower_h__

#define __Flower_h__

#include "SMSGamePlugin.h"

extern "C" CSMSGamePlugin *GetGameObject(void);

class CFlower: public CSMSGamePlugin

{

public:

virtual int Initialize(void);

virtual int Load(void);

virtual int Handle(void);

};

#endif

4、共享库实现文件:Flower.cpp

#include

#include "Flower.h"

CSMSGamePlugin *GetGameObject(void)

{

return(new CFlower());

}

int CFlower::Initialize(void)

{

< "Initialize()" <<

return(0);

}

int CFlower::Load(void)

{

< "Load()" <<

return(0);

}

int CFlower::Handle(void)

{

< "Handle()" <<

return(0);

}

DLL 导出封装类的更多相关文章

  1. DLL导出函数和类的定义区别 __declspec(dllexport)

    DLL导出函数和类的定义区别 __declspec(dllexport) 是有区别的, 请看 : //定义头文件的使用方,是导出还是导入 #if defined(_DLL_API) #ifndef D ...

  2. AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL导出函数包含MFC资源

    AFX_MANAGE_STATE(AfxGetStaticModuleState()) 先看一个例子: .创建一个动态链接到MFC DLL的规则DLL,其内部包含一个对话框资源.指定该对话框ID如下: ...

  3. dll 导出函数名的那些事

    dll 导出函数名的那些事 关键字: VC++  DLL  导出函数 经常使用VC6的Dependency或者是Depends工具查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导 ...

  4. C# 遍历DLL导出函数

    C#如何去遍历一个由C++或E语言编写的本地DLL导出函数呢 不过在这里我建议对PE一无所知的人 你或许应先补补这方面的知识,我不知道为什么PE方面的 应用在C#中怎么这么少,我查阅过相关 C#的知识 ...

  5. [百度空间] [原]DLL导出实例化的模板类

    因为模板是在编译的时候根据模板参数实例化的,实例化之后就像一个普通的类(函数),这样才有对应的二进制代码;否则,没有模板参数,那么编译器就不知道怎么生成代码,所以生成的DLL就没有办法导出模板了.但是 ...

  6. dll的概念 dll导出变量 函数 类

    1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别:   (1)静态链接 ...

  7. DLL导出与调用约定

    一般来说,从DLL导出函数有两种方法.一种是使用.def文件:另一种是使用__declspec(dllexport). 使用上面两种方法各有优缺点.使用.def文件就是需要额外维护,当导出函数更改名字 ...

  8. DLL 导出函数

    DLL的链接方式分为两种:隐式链接和显式链接 DLL导出的函数 和 导出类在调用时,有些区别,这里暂时不讲,直说简单的导出函数: 隐式链接: #include "stdafx.h" ...

  9. 利用openssl管理证书及SSL编程第3部分:将MinGW编译的openssl dll导出def和lib供MSVC使用

    将MinGW编译的openssl dll导出def和lib供MSVC使用 前面我们用mingw把openssl 编译成了动态库,得到下面2个dll文件: libeay32.dll ssleay32.d ...

随机推荐

  1. div居中方法

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. VS.Net 2015 Update3 学习(1) 支持Webpack

    让vs.net 编译的时候自动执行webpack 首先 管理员模式下打开 “Developer Command Prompt for VS2015", 是管理员模式啊! 然后进入 cd c: ...

  3. 搭建一个简单的Struts2(Struts2_HelloWorld)

    1.导入Jar包 2.配置web.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-ap ...

  4. angularJS 学习之路

    AngularJS 通过 ng-directives 扩展了 HTML. ng-app 指令定义一个 AngularJS 应用程序.也就是angularjs作用的入口  作用在什么标签或者整个body ...

  5. 准循环LDPC码用于公钥密码时的奇偶校验矩阵

    设H为奇偶校验矩阵,其行权重为d.Q为转置矩阵,其行权重为m.对于LDPC码,有d/n<< 1, m/n< 1. H´=H·QT是用于公钥密码的奇偶校验矩阵.它不是老密码G的奇偶校验 ...

  6. PHP JSON

  7. Python_Day4_函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 定义: 函数是指将一组语句的集合通过一个名字( ...

  8. Maven 手动添加 JAR 包到本地仓库

    Maven 确确实实是个好东西,用来管理项目显得很方便,但是如果是通过 Maven 来远程下载 JAR 包的话,我宿舍的带宽是4兆的,4个人共用,有时候用 Maven 来远程下载 JAR 包会显得很慢 ...

  9. 个人评测——K米

    K米APP案例分析 关于 K米 -- 的案例分析 产品 K米的APP (全国KTV点歌,手机直播,互动,交友,预订)的Android客户端 第一部分 调研,评测 评测: 软件的bug,功能评测,黑箱测 ...

  10. 自定义scrollview右侧的滑动条

    在做这个功能之前我其实是拒绝的,为什么这么说呢,因为我怕麻烦啊!(开玩笑的,怕麻烦就不做程序员了) 很久没有写博客,这次刚好项目中有个有趣的东西,想拿出来分享一下,希望能帮到某些小伙伴. 首先说说需求 ...