[原][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\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;
}

 

posted @ 2021-07-16 10:56  南水之源  阅读(242)  评论(0编辑  收藏  举报