← 文章归档

C++加载dll中的类

写这个主要是为了让自己写的程序支持插件 主题思路就是在dll中去继承一个基类,然后实现自己想要的一些功能,这个过程中就会涉及到读取dll中的类的方法。 首先我们需要在主程序中声明一个基类: pragma once class Graph { public: Graph() {…

写这个主要是为了让自己写的程序支持插件 主题思路就是在dll中去继承一个基类,然后实现自己想要的一些功能,这个过程中就会涉及到读取dll中的类的方法。 首先我们需要在主程序中声明一个基类:

	#pragma once
	class Graph
	{
	public:
		Graph() {};
		~Graph() {};
		virtual void move() = 0;
		virtual void save() = 0;
		virtual void isIn() = 0;
		virtual void SayHello() = 0;
	};

我们写的插件就需要继承Graph这个基类,实现这些方法。 于是我们在Test.h中写下

	#include "Graph.h"
	class Test :public Graph
	{
	public:
		virtual ~Test();
		void move() {};
		void save() {};
		void isIn() {};
		void SayHello();
	};
	//Test.cpp:
	void Test::SayHello()
	{
		cout << "hello" << endl;
	}

这样一来就可以实现插件的功能了。 然而最难的还是如何将这个类加载进我们的主程序中。 首先我们还需要在Test.cpp中加一个函数CreatTest():

//Test.h
Graph *CreateTest();

//Test.cpp
Graph *CreateTest() {
	Test *test = new Test;
	cout << "sucess" << endl;
	return test;
}

这样一来我们就可以通过调用CreateTest()来获得一个子类。

之后在主程序中我们还需要使用一点windowsAPI调用dll中的CreateTest()

HINSTANCE hDllInst;
hDllInst = LoadLibrary(L"Test.dll");
Graph* (*lpTestShow)() = (Graph*(*)())GetProcAddress(hDllInst, "CreateTest");
if (NULL != lpTestShow)
{
	Graph *temp = (*lpTestShow)();
	temp->SayHello();
}
FreeLibrary(hDllInst);

这里就是获取了CreatTest()的函数指针,之后直接调用获取的。

其实整个过程也并不复杂。。。。。。。。。

COMMENTS

一起聊聊

0

正在搬小板凳…

留下一条评论

友善讨论,不需要注册。评论使用无感安全检查;管理员邮箱还需要 Token 验证。

Turnstile 无感防护验证码尚未配置,评论暂不可用