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

时间:2011-08-02 19:31:48

标签: c++ class dll methods runtime

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

这是有效/可行/对吗?

编辑:

我知道这对于一般程序来说是一个糟糕的设计,但是这个方法旨在让用户能够使用他们可以访问主程序的api的自定义dll。类似Cpython模块的东西

3 个答案:

答案 0 :(得分:2)

有效且可行。在Visual C ++中生成示例DLL,代码将包含所有基础。使用LoadLibraryGetProcAdress替换客户端中的静态链接。

名称修改可能是一个问题,DependencyWalker将帮助您。

通过emory管理保持低调。例如,如果您在一侧使用内存管理器而在另一侧使用内存管理器,那么您就会遇到麻烦。

答案 1 :(得分:1)

我说这是可能的,但是在充分尊重的情况下,对我来说它看起来很糟糕。主程序和DLL之间存在循环依赖关系:程序从dll调用函数,反之亦然。在理想的设计中,主程序会消耗一些dll函数,而dll对主程序或者一般情况下对其客户端一无所知。

也许您应该将函数与dll需要在程序和dll使用的公共DLL或静态库中使用的主程序隔离。

答案 2 :(得分:0)

只要方法被声明为虚拟并且您通过引用或指针传递对象,就应该没有问题。但是,如果您想访问该类的非虚方法,则需要将其实现放在单独的DLL中。