C++ Windows 插件 - 传递类

Posted

技术标签:

【中文标题】C++ Windows 插件 - 传递类【英文标题】:C++ Windows Plugins - Passing Classes 【发布时间】:2011-03-06 20:42:28 【问题描述】:

我正在开发一个 C++ 插件系统,其中一个 C++ 可执行文件加载一个 dll 并通过 GetProcAddress 运行 plugin_start(someclass&)。

我完全理解如何将函数指针传递给 dll,反之亦然,以及 dll 如何使用头文件中定义的任何内容,但我希望 dll 能够使用someclass 在 someclass.h 中声明了 someclass 但在 someclass.cpp 中定义。

问题是,someclass 被编译到调用 executable 中,这意味着当 dll 尝试调用函数时,它会收到链接器错误。我什至明白为什么会这样,我不明白的是如何实现我想要的。

我想我可以传递一个指向对象的指针和一个指向函数的指针,即 someclass* somefunction* 然后将其调用为 someclass->*somefunction() 但这意味着我必须将一个指针传递给每个函数在每个班级。

有没有更简单的方法可以做到这一点,或者我应该只坚持 C 风格的函数和函数指针,而忘记尝试在两者之间传递整个类?

谢谢, 本

#ifndef EVENTREGISTRAR_H
#define EVENTREGISTRAR_H
#include <vector>

typedef void (__stdcall *error_callback_t)(const char *error);

class EventRegistrar


public:
    void OnError(error_callback_t fn);
    void FireError(const char *error);


private:
    std::vector<error_callback_t> errors;

;
#endif

-- Cpp

#include "PluginLoader.h"
void EventRegistrar::OnError(error_callback_t fn)

    this->errors.push_back(fn);


void EventRegistrar::FireError(const char *error)

    for (std::vector<error_callback_t>::iterator it = this->errors.begin();
        it != this->errors.end(); ++it)
    
        (*it)(error);
    

-- 动态链接库

#include "../plugin.h"
#include <stdio.h>
void __stdcall error(const char *error)  printf("Error: %s\n",error); 
extern "C" int __stdcall plugin_start(plugin_start_data& data)

    error_callback_t fn = error;
    data.events.OnError(fn);
    return LOAD_SUCCESS;

--错误

Error   1   error LNK2001: unresolved external symbol "public: void __thiscall EventRegistrar::OnError(void (__stdcall*)(char const *))" (?OnError@EventRegistrar@@QAEXP6GXPBD@Z@Z) D:\Files\C++ Workspace\BLib\BLib\Example Plugin\main.obj    Example Plugin

【问题讨论】:

跨 DLL 边界传递 STL 对象是个坏主意;将接口与实现分开,这样就可以避免这种情况。 【参考方案1】:

很久以前我就做过这样的事情。我只是使用一个直接的 C 接口来保持简单。

可能有更好的方法,但我认为传递指向对象的指针是您最好和最直接的方法。

【讨论】:

我仍然需要传递一个指向函数的指针,对吗?我试着只传递一个指向对象的指针,data->events->OnError(fn);并且仍然有链接器错误。 不,如果头文件在编译时可用,你应该只需要传递一个指向对象的指针。我不是 100% 清楚你对这些事件做了什么。当然,这会使事情复杂化。但是从指针引用类成员不应涉及任何链接器错误。这没有意义。 很困惑。让 EventRegistrar 的成员虚拟化让我的问题消失了,一切正常。 如果不花更多时间在您的代码上,我无法说出原因。但是,如果您只是传递指针,则不会进行编译时链接。这就是为什么我说链接器错误对我来说没有意义。无论如何,如果它有效,那么也许您已经找到了一个令人满意的解决方案。

以上是关于C++ Windows 插件 - 传递类的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 和 Linux 下开发的 C++ 程序的区别

在 C++ 和 C# 之间传递向量结构

Linux挂载windos共享提示error

将二维数组从 C# 传递到 C++

jQuery Virtual Keyboard 插件在 Windows 8 触摸设备上插入相同的字符两次

从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?