c++显式加载dll并使用DLL的类
转载自:
http://blog.163.com/tianjunqiang666@126/blog/static/8725911920121064573594/
// 下列 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 : 定义 DLL 应用程序的导出函数。
//#include "stdafx.h"
#include "Interface.h"
#include <iostream>
#include "test.h"// 通过导出函数形式向调用方提供指向派生类对象的基类指针
Interface* Export(void)
{return (Interface*)new Test();
}
#pragma once
#include "Interface.h"
#include <string>
class Test :public Interface
{
public:Test();virtual ~Test();virtual void ShowMsg(void);
private:std::string s;
};
#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的类相关推荐
- dll侧加载_动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)...
动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 Ge ...
- 【Android 逆向】类加载器 ClassLoader ( 类加载时机 | 隐式加载 | 显示加载 | 类加载步骤 | 装载 | 链接 | 初始化 )
文章目录 一.类加载时机 1.隐式加载 2.显式加载 二.类加载步骤 一.类加载时机 1.隐式加载 类加载 的 隐式加载 , 没有明确的说明加载某个类 , 但是进行了如下操作 : 使用 new 关键字 ...
- 无法加载安装程序库 wbemupgd.dll
当您在 Windows Server 2003 中使用"添加或删除程序"时收到错误消息"无法加载安装程序库 wbemupgd.dll" 要解决此问题,请按照下列 ...
- 64位ie加载java失败_java-无法在AMD 64位平台上加载IA 32位.dll
java-无法在AMD 64位平台上加载IA 32位.dll 我正在尝试通过此页面上的JNI包装器使用Java中的SVMLight: static { System.loadLibrary(" ...
- c 内存加载易语言dll,[求助]MemoryLoadLibrary 加载MFC 易语言 DLL 失败
[求助]MemoryLoadLibrary 加载MFC 易语言 DLL 失败 2011-10-6 13:32 13431 [求助]MemoryLoadLibrary 加载MFC 易语言 DLL 失败 ...
- 用video标签流式加载
video标签 浏览器的video标签通常是接收一个src属性,然后浏览器就会根据这个src属性来自动加载视频. 这个过程是浏览器来加载video的. 这种方式有什么问题吗? mp4文件不能流式加载 ...
- 用ffmpeg修改MP4文件头信息,使其支持流式加载及播放
经常有用户反映,有些网页中加载的mp4文件,有的可以加载一点就开始播放,有的就必须全部加载完才能播. 经核实,主要是头信息的数据顺序有关,用工具:mp4info.exe可以查看mp4文件的结构信息: ...
- Python无法加载vc产生的DLL - 一种异常的情况
Python无法加载vc产生的DLL - 一种异常的情况 本地调试时候一切正常,发布给客户就出现如下错误:无法导入DLL. 最后查明原因是:VC编译dll的设定差异导致. 有问题的设置: 改变后的设置 ...
- 基于PsSetLoadImageNotifyRoutine实现监控模块加载并卸载已加载模块(卸载DLL、EXE和sys等加载)
背景 对于内核层实现监控模块的加载,包括加载DLL模块.内核模块等.你也许会想到 HOOK 各种内核函数来实现.确定,在内核层中的 HOOK 已经给人留下太多深刻的印象了,有 SSDT HOOK.In ...
最新文章
- 咏南LINUX中间件
- Hive Error : Java heap space 解决方案
- 小姐姐在硅谷生活了三年,实现了理想的生活模式
- 为什么软件开发周期是预估的2~3倍?
- P1192 台阶问题(递推)
- jQuery Mobile 基础(第三章)
- 何为TransmittableThreadLocal
- Nhibernate和 Entity Framework 4优缺点
- html盒子阴影只设置左右,只在容器一边或两边显示盒子阴影
- a*算法流程图_光伏逆变器MPPT基本算法介绍李星硕
- php 去除标签内样式,PHP去除html标签,php标记及css样式代码参考
- java四类八种基本数据类型
- 突然发现到今天已经很难找到对底层理解这么透彻的人
- eclipse android 服务端,Eclipse搭建服务器,实现与Android的简单通信
- Android 资源(Resources)访问
- (附源码)计算机毕业设计ssm大众点评管理系统
- elasticsearch 分组求和
- 学信号处理要理解均值、平均偏差、标准差、方差
- 如何写好工作日报,周报,月报?
- 删除文件夹显示找不到该项目,也无法改名、移动等
热门文章
- PowerDesigner12对SQL2005反向工程问题.
- 关于Xcode 7.3 7.3.1 断点 卡死 无限菊花
- 如何通过RFID开发来迎接第四次工业革命(转)
- Eclipse变量名自动补全问题 自定义上屏按键为TAB
- 前端面试---Vue部分考点梳理
- spring 源码-context
- koa --- 使用Github OAuth登录
- DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.Net2.0(ver 3.0.7Beta) 增加多语言!
- C++标准输入流、输出流以及文件流
- OC Swift混编-Swift.h File not found