Я работаю над системой плагинов в C ++, в которой исполняемый файл C ++ загружает dll и запускает plugin_start (someclass &) через GetProcAddress.
Я полностью понимаю, как передать указатели функций на dll и наоборот, и как dll может использовать все, что определено в заголовочном файле, но я хотел бы, чтобы dll могла использовать некоторый класс где someclass объявлен в someclass.h, но определен в someclass.cpp.
Уловка в том, что someclass компилируется в вызывающий исполняемый файл , что означает, что когда 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);
}
}
- DLL
#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