Плагины C ++ для Windows - Проходящие классы - PullRequest
0 голосов
/ 06 марта 2011

Я работаю над системой плагинов в 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

1 Ответ

0 голосов
/ 06 марта 2011

Я сделал что-то подобное давным-давно.Я просто использовал простой интерфейс C для простоты.

Возможно, есть лучший способ, но я думаю, что передача указателя на объект - ваш лучший и самый простой подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...