DLL должна получить доступ к символам своего приложения - PullRequest
3 голосов
/ 13 декабря 2010

В C ++ возможно ли для DLL получить доступ к некоторым символам приложения, которое ее загрузило? У меня есть приложение, которое загружает плагины (dll), и эти плагины должны иметь доступ к некоторому API приложения.

Возможно ли достичь этого без создания новой библиотеки DLL, которая разделяет этот API?

Подходит ли структура указателей на функции в этой ситуации?

пример: функция Bool Log (char *), определенная в хост-приложении, и плагин, который должен регистрировать некоторые события.

Ответы [ 3 ]

2 голосов
/ 13 декабря 2010

Еще один голос за передачу интерфейса обратного вызова в подключаемый модуль DLL.Т.е. интерфейс обратного вызова ...

class IHostApplication
  {
  public:
    virtual bool Log(const wchar_t* ip_log_string) = 0;
  };

Интерфейс плагина DLL

class IPlugin
  {
  public:
    virtual void InitializePlugin(IHostApplication *ip_host) = 0;
  };

Хост загрузит подключаемую DLL (динамически, если необходимо), а затем передаст себя какIHostApplication * к плагину, включающий любой обратный вызов, который вы можете захотеть.

1 голос
/ 13 декабря 2010

Возможно, но ваш выбор дизайна сомнителен.

EXE может экспортировать функции так же, как DLL, поэтому вы можете использовать GetProcAddress так, как вам знакомо.

Однако, почему вы разработали его так, чтобы plugins должны были что-то знать о внутренних функциях программы хоста? Должно быть наоборот.

Хост должен требовать, чтобы плагины реализовали набор подпрограмм (которые они экспортируют) в соответствии с конкретным контрактом. Как часть их интерфейса, хост может передавать им специфичную для хоста информацию в указателе на структуру (скажем, информацию о версии, возможностях) и т.п., если это необходимо.

Плагины не должны пытаться получить функциональные указатели на хост-модуль.

0 голосов
/ 13 декабря 2010

Указатель на функцию обратного вызова, список указателей на функции обратного вызова или указатель на интерфейс обратного вызова - я бы использовал одну из этих опций. Клиент Dll должен реализовать интерфейс обратного вызова и передать указатель на этот интерфейс динамически созданному Dll. Динально созданный Dll сохраняет этот указатель и при необходимости вызывает его функции, например, для сообщения о некоторых событиях.

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