我有一个(大而复杂的)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模块的东西
答案 0 :(得分:2)
有效且可行。在Visual C ++中生成示例DLL,代码将包含所有基础。使用LoadLibrary
和GetProcAdress
替换客户端中的静态链接。
名称修改可能是一个问题,DependencyWalker将帮助您。
通过emory管理保持低调。例如,如果您在一侧使用内存管理器而在另一侧使用内存管理器,那么您就会遇到麻烦。
答案 1 :(得分:1)
我说这是可能的,但是在充分尊重的情况下,对我来说它看起来很糟糕。主程序和DLL之间存在循环依赖关系:程序从dll调用函数,反之亦然。在理想的设计中,主程序会消耗一些dll函数,而dll对主程序或者一般情况下对其客户端一无所知。
也许您应该将函数与dll需要在程序和dll使用的公共DLL或静态库中使用的主程序隔离。
答案 2 :(得分:0)
只要方法被声明为虚拟并且您通过引用或指针传递对象,就应该没有问题。但是,如果您想访问该类的非虚方法,则需要将其实现放在单独的DLL中。