c++显式加载dll并使用DLL的类

转载自:


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Debian上安装配置ownCloud

如何在Debian上安装配置ownCloud 据其官方网站&#xff0c;ownCloud可以让你通过一个Web界面或者WebDAV访问你的文件。它还提供了一个平台&#xff0c;可以轻松地查看、编辑和同步您所有设备的通讯录、日历和书签。尽管ownCloud与广泛使用Dropbox非常相似&#xff0c;但主要区别…

jQuery相当于对 javascript二次开发,所以基于 jQuery实现的各种插件直接调用即可...

jQuery相当于对 javascript二次开发&#xff0c;所以基于 jQuery实现的各种插件直接调用即可转载于:https://www.cnblogs.com/npk19195global/p/4482363.html

[转]js判断url是否有效

本文转自&#xff1a;http://www.cnblogs.com/fumj/p/3490121.html 方法一:(仅适用于ie) function CheckStatus(url){XMLHTTP new ActiveXObject("Microsoft.XMLHTTP")XMLHTTP.open("HEAD",url,false)XMLHTTP.send()return XMLHTTP.status200}function Ne…

VS中lib和dll

转载&#xff1a; &#xfeff;&#xfeff;http://www.cnblogs.com/Yogurshine/archive/2013/06/14/3136025.html Lib文件 先来说一说lib文件&#xff0c;C中lib文件主要有两类&#xff0c;一种是静态的编译连接&#xff0c;叫做静态链接库&#xff0c;另一种是动态的编译链…

32位md5解密_冰蝎特征检测及报文解密

点击“蓝字”关注我们&#xff0c;不迷路~‍‍前言19年驻场于某金融单位。参加19年9月、11月两次攻防演练&#xff0c;负责攻防演练组织、技术支持和复盘。期间&#xff0c;多个攻击队伍使用冰蝎 webshell &#xff0c;防守方监测时确实各 IDS 确实报出 webshell 连接&#xff…

使用extern C改善显式调用dll

extern "C"的简单解析 我们前面介绍了显式调用dll的方法&#xff0c;例如 &#xfeff;&#xfeff;http://www.cnblogs.com/laogao/archive/2012/12/07/2806528.html &#xff0c;其中在GetProcAddress第二个参数的填写煞费苦心&#xff0c;我们需要比较麻烦…

《移动App测试的22条军规》—App测试综合案例分析23.13节测试微信App的流量和电量消耗...

本节书摘来自异步社区《移动App测试的22条军规》一书中的App测试综合案例分析&#xff0c;第23.13节测试微信App的流量和电量消耗&#xff0c;作者黄勇&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 23.13 测试微信App的流量和电量消耗关于微信App消耗流…

UVA 10269 Super Mario,最短路+动态规划

这个题目我昨晚看到的&#xff0c;没什么思路&#xff0c;因为马里奥有boot加速器&#xff0c;只要中间没有城堡&#xff0c;即可不耗时间和脚力&#xff0c;瞬间移动不超过L距离&#xff0c;遇见城堡就要停下来&#xff0c;当然不能该使用超过K次。。。我纠结了很久&#xff0…

python做数据可视化的代码_Python数据可视化正态分布简单分析及实现代码

Python说来简单也简单&#xff0c;但是也不简单&#xff0c;尤其是再跟高数结合起来的时候。。。 正态分布&#xff08;Normaldistribution&#xff09;&#xff0c;也称“常态分布”&#xff0c;又名高斯分布&#xff08;Gaussiandistribution&#xff09;&#xff0c;最早由A…

ACdream 1061(abs用法)

题目链接&#xff1a;http://acdream.info/problem?pid1061 主要是abs用法&#xff0c;看题目的数据 long long的最大值&#xff1a;9223372036854775807 long long的最小值&#xff1a;-9223372036854775808 unsigned long long的最大值&#xff1a;18446744073709551615 由题…

wpf window 不执行show 就不能load执行_Numpy反序列化命令执行漏洞分析(CVE-2019-6446)附0day...

1、介绍 NumPy 是 Python 机器学习库中之一&#xff0c;主要对于多为数组执行计算。NumPy 提供大量的 函数和操作&#xff0c;能够帮助程序员便利进行数值计算。在 NumPy 1.16.0 版本之前存在反序列化 命令执行漏洞&#xff0c;用户加载恶意的数据源造成命令执行。2、环境 软件…

使用Def文件导出dll

前面我们介绍了dll的生成&#xff0c;大多数是使用extern "C"__declspec(dllexport)函数名的方法导出dll。其实我们还有另一种方法来导出dll。 先介绍参考文献&#xff1a; 1.dll导出声明相关 2.VS2012中 C创建DLL图解 3.DLL中导出函数的两种方式(dllexport与.…

HDU 1003 Maxsum

题目大意&#xff1a;求出数列的最大子段和&#xff0c;并且说明是从第几项至第几项。 题解1&#xff1a;简单贪心。 #include <cstdio> #define rep(i,n) for(int i1;i<n;i) int main(){int t,l0;scanf("%d",&t);while(t--&&l){if(l!1)printf…

《JavaScript面向对象精要》——1.8 原始封装类型

本节书摘来自异步社区《JavaScript面向对象精要》一书中的第1章&#xff0c;第1.8节&#xff0c;作者&#xff1a;【美】Nicholas C. Zakas著&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.8 原始封装类型 JavaScript中一个最让人困惑的部分可能就是原始…

XML语法学习

本文章集合两篇博文而写&#xff0c;两篇博文地址&#xff1a; XML学习总结(二)——XML入门&#xff1a; XML基础<第一篇> XML简介 XML是一种标记语言&#xff0c;用于描述数据&#xff0c;它提供一种标准化的方式来来表示文本数据。XML文档以.xml为后缀。需要彻底注…

FM实现F4帮助系列三:弹出框多筛选…

FM实现F4帮助系列三&#xff1a;弹出框多筛选条件的搜索帮助&#xff08;根据搜索帮助筛选字段&#xff09;函数&#xff1a;F4IF_GET_SHLP_DESCRF4IF_START_VALUE_REQUEST效果图&#xff1a;本例子代码&#xff1a;找到需要的帮助:*&------------------------------------…

[数分提高]2014-2015-2第9教学周第1次课 (2015-04-28)

设 $$\bex a,b>0,\quad 0\leq f\in \calR[a,b],\quad \int_a^b xf(x)\rd x0. \eex$$ 试证: $$\bex \int_a^b x^2f(x)\rd x\leq ab \int_a^b f(x)\rd x; \eex$$ 并给出使得下列不等式成立的 (您认为的) 最优数: $$\bex \int_a^b x^3f(x)\rd x\leq (\quad) \int_a^b f(x)\rd x…

《计算复杂性:现代方法》——0.2 判定问题/语言

本节书摘来自华章计算机《计算复杂性&#xff1a;现代方法》一书中的第0章&#xff0c;第0.2节&#xff0c;作者 &#xff3b;美&#xff3d;桑杰夫阿罗拉&#xff08;Sanjeev Arora&#xff09;&#xff0c;博阿兹巴拉克&#xff08;Boaz Barak&#xff09;&#xff0c;译 骆吉…

python从date目录导入数据集_使用python划分数据集

无论是训练机器学习或是深度学习&#xff0c;第一步当然是先划分数据集啦&#xff0c;今天小白整理了一些划分数据集的方法&#xff0c;希望大佬们多多指教啊&#xff0c;嘻嘻~ 首先看一下数据集的样子&#xff0c;flower_data文件夹下有四个文件夹&#xff0c;每个文件夹表示一…

开源牛人 zcbenz

事情是这样的&#xff0c;微软推出了Visual Studio Code&#xff0c;我很好奇他怎么做跨平台的&#xff0c;所以就找找资料&#xff0c;在他的网站中是这么描述的&#xff1a; Architecturally, Visual Studio Code combines the best of web, native, and language-specific t…