从运行时加载的Dll中调用主程序的方法
Calling methods of the main program from run time loaded Dll
我有一个(大而复杂的)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,代码将涵盖所有基础。将客户端静态链接替换为LoadLibrary
和GetProcAdress
名称混淆可能是一个问题,DependencyWalker将帮助您解决这个问题。
保持低调的内存管理。例如,如果您在一侧使用内存管理器而不在另一侧使用,那么您就是在自找麻烦。
我想说这是可能的,但是在我看来,这是一个糟糕的设计。主程序和dll之间存在循环依赖关系:程序从dll调用函数,反之亦然。在理想的设计中,主程序会使用一些dll函数,而dll不知道主程序的任何信息,或者通常不知道它的客户端。
也许你应该把dll需要使用的函数从主程序中隔离出来,放在程序和dll都使用的公共dll或静态库中。
只要将方法声明为虚方法,并且通过引用或指针传递对象,就应该没有问题。然而,如果你想访问类的非虚拟方法,你需要把它的实现放在一个单独的DLL中。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 输出 = 0 尝试计算标头中的函数并在主程序中调用它们时
- 如何在主程序流中不调用全局变量的情况下填充全局变量
- 从运行时加载的Dll中调用主程序的方法
- 从动态加载的库(QPluginLoader)调用主程序函数