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

5967人阅读 评论(0) 收藏 举报
分类:
转载自:


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 once

class 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中的函数

在C++调用dll
  • ermeiyao11
  • ermeiyao11
  • 2017-04-01 23:31:29
  • 1864

利用C++制作dll并调用dll

Abstract:本文讲解如何利用c++制作dll并调用dll,用一个简单的加法函数来作为演示,并给出图形界面。1. 打开vs(我用的是vs2010),然后点击文件—>文件—>新建—>项目,选择Win...
  • hlx371240
  • hlx371240
  • 2016-05-26 15:58:40
  • 15612

C++ 动态链接库的两种调用方式

转载地址:http://blog.csdn.net/zy_dreamer/article/details/8878944?utm_source=tuicool 1. Load...
  • fengfeiwanqian
  • fengfeiwanqian
  • 2015-08-13 20:26:28
  • 7645

学习使用C++封装DLL并调用

身为学渣,总是学完就忘,所以写下来方便自己以后查看,也是为其他小白提供一点思路。 参考的资料:http://blog.csdn.net/u011221078/article/details/4130...
  • nimaqusia
  • nimaqusia
  • 2016-12-23 10:02:04
  • 3223

C++调用DLL接口

基础概念: SDK API DLL SDK sdk 软件开发工具包,软件开发工具包广义上指辅助开发某一类软件的相关文档、范例和工具的集合。一般而言SDK即开发Windows平台下的应用程序所使用的...
  • Codepe
  • Codepe
  • 2015-07-19 16:40:17
  • 434

C++编程笔记:dll的生成与使用

1.动态链接库(dll)概述没接触dll之前觉得它很神秘,就像是一个黑盒子,既不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其他dll调用来完成某项工作的函数,只有在其他...
  • elaine_bao
  • elaine_bao
  • 2016-06-29 19:24:40
  • 9698

c++ 创建dll以及调用dll的案例

1,新建一个空项目,定义头文件,源文件, //CameraDLLl.h extern "C" __declspec(dllexport) bool IAInitCamera...
  • u011533780
  • u011533780
  • 2017-01-11 18:57:48
  • 870

VS2013 c++ 生成和调用DLL动态链接库

创建动态库方法: 创建动态库是生成 .dll .lib 两个个文件 文件 -> 新建 -> 项目 -> win32控制台应用程序 项目名称:DLLGenerator 应用程序类型:DLL...
  • zhunianguo
  • zhunianguo
  • 2016-08-23 20:54:21
  • 12222

C++ 显式调用DLL

1. DLL直接放到DEBUG目录下即可 2,程序中加入代码:例如DLL名为SendRcv.dll,方法名为Int ReadCard(char a[], char b[]) typedef...
  • Sayesan
  • Sayesan
  • 2015-11-18 15:32:19
  • 684

C++ dll的隐式与显式调用

 转载自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html   应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显...
  • xiamentingtao
  • xiamentingtao
  • 2016-04-04 00:24:29
  • 4865
    个人资料
    持之以恒
    等级:
    访问量: 34万+
    积分: 4722
    排名: 7686
    个人网站
    最新评论