[原][C++][插件]window下C++简单插件机制实现
共用头文件:
Object.h
#ifndef __OBJECT_H__ #define __OBJECT_H__ class Object { public: Object() {} virtual ~Object() {} virtual int Dump() = 0; }; #endif //__OBJECT_H__
插件部分:
插件的名字:testPlugin1.dll
TestObject.h
#pragma once #include "../use/Object.h" // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 TESTPLUGIN1_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // TESTPLUGIN1_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifdef TESTPLUGIN1_EXPORTS #define TESTPLUGIN1_API __declspec(dllexport) #else #define TESTPLUGIN1_API __declspec(dllimport) #endif /****************************************************************/ // 此类是从 testPlugin1.dll 导出的 class TESTPLUGIN1_API TestObject : public Object { public: virtual int Dump(); // TODO: 在此添加您的方法。 }; extern TESTPLUGIN1_API int ntestPlugin1; TESTPLUGIN1_API int fntestPlugin1(void);
TestObject.cpp
#include "TestObject.h" #include <iostream> // 这是已导出类的构造函数。 // 有关类定义的信息,请参阅 TestObject.h int TestObject::Dump() { std::cout << "class name:TestObject function name:Dump()" << std::endl; return 0; } // 这是导出变量的一个示例 TESTPLUGIN1_API int ntestPlugin1 = 0; // 这是导出函数的一个示例。 TESTPLUGIN1_API int fntestPlugin1(void) { return 42; } extern "C"// 为什么使用这个extern "C"声明:https://blog.csdn.net/zhanghuaichao/article/details/94834099 { TESTPLUGIN1_API void *Instance() { return new TestObject; } }
南水之源原创,原文链接:https://www.cnblogs.com/lyggqm/p/15019116.html
调用部分:
新建调用工程生成use.exe
主函数入口:use.cpp
#include<wtypes.h> #include <winbase.h> #include <iostream> #include "Object.h" typedef Object *Instance(); int main() { HINSTANCE hDLL; hDLL = LoadLibrary(L"testPlugin1.dll"); //加载 DLL文件 if (hDLL == NULL) std::cout << "Error!!! Can not find plugin\n"; Instance *GetInstance = (Instance *)GetProcAddress(hDLL, "Instance"); //取DLL中的函数地址,以备调用 //Instance *GetInstance = (Instance *)dlsym(handle, "Instance"); if (!GetInstance) { std::cout << "Error Instance function" << std::endl; } else { Object *obj = GetInstance(); if (0 != obj) { obj->Dump(); } delete obj; } FreeLibrary(hDLL); getchar(); return 0; }