转载自:



http://blog.163.com/tianjunqiang666@126/blog/static/8725911920121064573594/

首先需要强调,当使用某个类时一般目的有二:实例化成对象或者继承它产生新类。
对于前者,我们可以构造一个抽象类(java里的接口)来连接调用方和DLL。
// Interface.h 公共文件/ 公共接口
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 INTERFACE_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// INTERFACE_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef INTERFACE_EXPORTS
#define INTERFACE_API __declspec(dllexport)
#else
#define INTERFACE_API __declspec(dllimport)
#endif#pragma onceclass Interface
{
public:virtual void ShowMsg() = 0; // 将调用方需要调用的成员函数声明成纯虚函数virtual ~Interface(){};// 抽象类的虚析构函数
};
extern "C" INTERFACE_API Interface* Export(void);
// Interface.cpp 被调用方文件
// 注意下面的代码并不是实现 Interface 类,而是因为联系紧密才写在这。
// Interface.cpp : 定义 DLL 应用程序的导出函数。
//#include "stdafx.h"
#include "Interface.h"
#include <iostream>
#include "test.h"// 通过导出函数形式向调用方提供指向派生类对象的基类指针
Interface* Export(void)
{return (Interface*)new Test();
}
将真正要调用的类声明成抽象类 Interface 的派生类:
#pragma once
#include "Interface.h"
#include <string>
class Test :public Interface
{
public:Test();virtual ~Test();virtual void ShowMsg(void);
private:std::string s;
};
// Test.cpp 被调用方文件
// 类的实现
#include "stdafx.h"
#include "test.h"
#include <iostream>Test::Test()
{s = "hello form dll";
}Test::~Test()
{std::cout << "destroy";
}void Test::ShowMsg()
{std::cout << s << std::endl;
}

调用方调用DLL时动态加载:

#include <Windows.h>
#include <iostream>
#include "Interface.h" // 包含抽象类从而使用接口// 在调用处添加如下代码
using pExport = Interface* (*)(void); // 定义指向导出函数的指针类型int main()
{HINSTANCE hDll = LoadLibrary("Interface.dll");// 加载DLL库文件,DLL名称和路径用自己的if (hDll == NULL){std::cout << "load dll fail \n";return -1;}pExport Get = (pExport)GetProcAddress(hDll, "Export");// 将指针指向函数首地址if (Get == NULL){std::cout << "load address fail \n";return -1;}Interface *t = Get();// 调用导出函数获得抽象类指针t->ShowMsg();// 通过该指针调用类成员函数delete t; // 释放DLL中生成的对象FreeLibrary(hDll); //释放库句柄system("pause");return 0;
}

此时需要注意两点:

1.我们需要把Interface.h放在UseDLL工程目录下

2.如果编译时出现:无法将参数 1 从“const char [14]”转换为“LPCWSTR”的错误,则我们需要

点击项目属性,常规-》字符集-》改为“未设置”即可

实际上整个项目的方法是Interface完成了接口的设置,而具体的实现在test中进行,真正使用了类的抽象性和多态性,封闭性。

项目下载路径:http://7xs15g.com1.z0.glb.clouddn.com/Interface.zip

c++显式加载dll并使用DLL的类相关推荐

  1. dll侧加载_动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)...

    动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 Ge ...

  2. 【Android 逆向】类加载器 ClassLoader ( 类加载时机 | 隐式加载 | 显示加载 | 类加载步骤 | 装载 | 链接 | 初始化 )

    文章目录 一.类加载时机 1.隐式加载 2.显式加载 二.类加载步骤 一.类加载时机 1.隐式加载 类加载 的 隐式加载 , 没有明确的说明加载某个类 , 但是进行了如下操作 : 使用 new 关键字 ...

  3. 无法加载安装程序库 wbemupgd.dll

    当您在 Windows Server 2003 中使用"添加或删除程序"时收到错误消息"无法加载安装程序库 wbemupgd.dll" 要解决此问题,请按照下列 ...

  4. 64位ie加载java失败_java-无法在AMD 64位平台上加载IA 32位.dll

    java-无法在AMD 64位平台上加载IA 32位.dll 我正在尝试通过此页面上的JNI包装器使用Java中的SVMLight: static { System.loadLibrary(" ...

  5. c 内存加载易语言dll,[求助]MemoryLoadLibrary 加载MFC 易语言 DLL 失败

    [求助]MemoryLoadLibrary 加载MFC 易语言 DLL 失败 2011-10-6 13:32 13431 [求助]MemoryLoadLibrary 加载MFC 易语言 DLL 失败 ...

  6. 用video标签流式加载

    video标签 浏览器的video标签通常是接收一个src属性,然后浏览器就会根据这个src属性来自动加载视频. 这个过程是浏览器来加载video的. 这种方式有什么问题吗? mp4文件不能流式加载 ...

  7. 用ffmpeg修改MP4文件头信息,使其支持流式加载及播放

    经常有用户反映,有些网页中加载的mp4文件,有的可以加载一点就开始播放,有的就必须全部加载完才能播. 经核实,主要是头信息的数据顺序有关,用工具:mp4info.exe可以查看mp4文件的结构信息: ...

  8. Python无法加载vc产生的DLL - 一种异常的情况

    Python无法加载vc产生的DLL - 一种异常的情况 本地调试时候一切正常,发布给客户就出现如下错误:无法导入DLL. 最后查明原因是:VC编译dll的设定差异导致. 有问题的设置: 改变后的设置 ...

  9. 基于PsSetLoadImageNotifyRoutine实现监控模块加载并卸载已加载模块(卸载DLL、EXE和sys等加载)

    背景 对于内核层实现监控模块的加载,包括加载DLL模块.内核模块等.你也许会想到 HOOK 各种内核函数来实现.确定,在内核层中的 HOOK 已经给人留下太多深刻的印象了,有 SSDT HOOK.In ...

最新文章

  1. 咏南LINUX中间件
  2. Hive Error : Java heap space 解决方案
  3. 小姐姐在硅谷生活了三年,实现了理想的生活模式
  4. 为什么软件开发周期是预估的2~3倍?
  5. P1192 台阶问题(递推)
  6. jQuery Mobile 基础(第三章)
  7. 何为TransmittableThreadLocal
  8. Nhibernate和 Entity Framework 4优缺点
  9. html盒子阴影只设置左右,只在容器一边或两边显示盒子阴影
  10. a*算法流程图_光伏逆变器MPPT基本算法介绍李星硕
  11. php 去除标签内样式,PHP去除html标签,php标记及css样式代码参考
  12. java四类八种基本数据类型
  13. 突然发现到今天已经很难找到对底层理解这么透彻的人
  14. eclipse android 服务端,Eclipse搭建服务器,实现与Android的简单通信
  15. Android 资源(Resources)访问
  16. (附源码)计算机毕业设计ssm大众点评管理系统
  17. elasticsearch 分组求和
  18. 学信号处理要理解均值、平均偏差、标准差、方差
  19. 如何写好工作日报,周报,月报?
  20. 删除文件夹显示找不到该项目,也无法改名、移动等

热门文章

  1. PowerDesigner12对SQL2005反向工程问题.
  2. 关于Xcode 7.3 7.3.1 断点 卡死 无限菊花
  3. 如何通过RFID开发来迎接第四次工业革命(转)
  4. Eclipse变量名自动补全问题 自定义上屏按键为TAB
  5. 前端面试---Vue部分考点梳理
  6. spring 源码-context
  7. koa --- 使用Github OAuth登录
  8. DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.Net2.0(ver 3.0.7Beta) 增加多语言!
  9. C++标准输入流、输出流以及文件流
  10. OC Swift混编-Swift.h File not found