Вызов методов основной программы из загруженного времени выполнения Dll - PullRequest
1 голос
/ 02 августа 2011

У меня есть (большая и сложная) программа на C ++ со своими собственными классами и методами. (Очевидно)

Я хотел бы загрузить во время выполнения DLL.Из основной программы я хочу вызвать функцию внутри dll, передающую экземпляр класса, и эта функция будет использовать метод этого класса.

В псевдокоде

Основная программа:

 class MyClass{
       myattr1();
       myattr2();
       mymethod1();
       mymethod2();
 }

 void main(){
      MyClass* object = &(new MyClass())
      handle_of_the_dll = *some function that load the dll*
      dllfunc = getfunc(handle_of_the_dll, "interesting_function")
      dllfunc(object)
      [...etc...]

и dll

#ifdef __cplusplus
extern C {
#endif
#ifdef BUILD_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif

#include all the needed headers from main program, where the class is defined

EXPORT void  interesting_functionn(MyClass object){
  object.mymethod1();
}
#ifdef __cplusplus
}
#endif

Это допустимо / выполнимо / правильно?

РЕДАКТИРОВАТЬ:

я знаю, что это будет плохой дизайн дляобычная программа, но этот метод предназначен для того, чтобы дать пользователям возможность использовать свои собственные dll, которые могут получить доступ к API основной программы.Что-то вроде модулей Cpython

Ответы [ 3 ]

2 голосов
/ 02 августа 2011

Это допустимо и выполнимо. Создайте образец DLL в Visual C ++, и в коде будут рассмотрены все основы. Замените статическое связывание в клиенте на LoadLibrary и GetProcAdress.

Возможно, искажение имени может быть проблемой, DependencyWalker поможет вам в этом.

Ведите себя сдержанно с управлением Эмори. Например, если вы используете диспетчер памяти с одной стороны, а не с другой, это означает, что у вас возникли проблемы.

1 голос
/ 02 августа 2011

Я бы сказал, что это возможно, но при всем моем уважении это выглядит как плохой дизайн для меня. Между основной программой и dll существует циклическая зависимость: программа вызывает функции из dll и наоборот. В идеальном варианте основная программа будет потреблять некоторые функции dll, и dll не будет ничего знать о основной программе или вообще о ее клиентах.

Возможно, вам следует изолировать функции от основной программы, которые dll должна использовать в общей dll или статической lib, которую используют как программа, так и dll.

0 голосов
/ 02 августа 2011

Пока методы объявлены виртуальными и вы передаете объект по ссылке или по указателю, проблем не должно быть.Однако если вы хотите получить доступ к не виртуальным методам класса, вам нужно поместить его реализацию в отдельную DLL.

...