从运行时加载的Dll中调用主程序的方法

Calling methods of the main program from run time loaded Dll

本文关键字:调用 主程序 方法 Dll 运行时 加载      更新时间:2023-10-16

我有一个(大而复杂的)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 modules

这是有效可行的。在visual c++中生成一个样例DLL,代码将涵盖所有基础。将客户端静态链接替换为LoadLibraryGetProcAdress

名称混淆可能是一个问题,DependencyWalker将帮助您解决这个问题。

保持低调的内存管理。例如,如果您在一侧使用内存管理器而不在另一侧使用,那么您就是在自找麻烦。

我想说这是可能的,但是在我看来,这是一个糟糕的设计。主程序和dll之间存在循环依赖关系:程序从dll调用函数,反之亦然。在理想的设计中,主程序会使用一些dll函数,而dll不知道主程序的任何信息,或者通常不知道它的客户端。

也许你应该把dll需要使用的函数从主程序中隔离出来,放在程序和dll都使用的公共dll或静态库中。

只要将方法声明为虚方法,并且通过引用或指针传递对象,就应该没有问题。然而,如果你想访问类的非虚拟方法,你需要把它的实现放在一个单独的DLL中。