• [原][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);
    View Code

    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;
        }
    }
    View Code

    南水之源原创,原文链接: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
    ";
    
        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;
    }
  • 相关阅读:
    1221D
    1249E
    D. Yet Another Monster Killing Problem
    大佬传送门
    Zookeeper客户端连接报错
    搭建PXC集群
    Docker分布式环境
    Docker使用
    Docker入门
    MySQL数据库集群概述
  • 原文地址:https://www.cnblogs.com/lyggqm/p/15019116.html
Copyright © 2020-2023  润新知