C++ 当类型及其内容在不同DLL之间变化时,访问结构内容';s

C++ 当类型及其内容在不同DLL之间变化时,访问结构内容';s,c++,dll,C++,Dll,我有这些项目中,我需要接口几个代码生成的dll的(从MATLAB,如果你想知道)。dll在本质上是相似的,假设下面的两个函数和两个结构是我们感兴趣的 function1_ptr = (void(*)(void)) GetProcAddress(libraryHandle, "NAME_function1"); function2_ptr = (void(*)(void)) GetProcAddress(libraryHandle, "NAME_function1"); struct1_ptr

我有这些项目中,我需要接口几个代码生成的dll的(从MATLAB,如果你想知道)。dll在本质上是相似的,假设下面的两个函数和两个结构是我们感兴趣的

function1_ptr  = (void(*)(void)) GetProcAddress(libraryHandle, "NAME_function1");
function2_ptr  = (void(*)(void)) GetProcAddress(libraryHandle, "NAME_function1");
struct1_ptr    = (STRUCT1_TYPE*) GetProcAddress(libraryHandle, "NAME_var1");
struct2_ptr    = (STRUCT2_TYPE*) GetProcAddress(libraryHandle, "NAME_var2");
在dll之间,它们仅因名称前缀(name)、结构类型(*STRUCTX_type*)和函数内容而不同

加载这些dll的代码的要求是,它应该能够运行函数(没有问题),并且能够获取和设置两个结构的成员变量(问题!!) (如果成员变化产生问题,则可以将其设置为常量)

我的问题是: 考虑到这些(非常松散的)要求,连接此类dll集合的最简单方法是什么? (如果描述不完整,请发表评论,我将编辑我的帖子)

下面是我对一个我不满意的解决方案的想法


我当前的代码是这样的:

class Interface
{
    virtual void function1(void) = 0;
    virtual void function2(void) = 0;
    virtual void function3(void) = 0;

    virtual void setInput(STRUCT_MEMBERS_ENUM input, double value) = 0;
virtual double getOutput(STRUCT_MEMBERS_ENUM output) const = 0;
};

template <typename STRUCT1_TYPE, typename STRUCT2_TYPE>
class Model : public Interface 
{
    ...
};
类接口
{
虚空函数1(虚空)=0;
虚空函数2(虚空)=0;
虚空函数3(虚空)=0;
虚拟void setInput(结构成员枚举输入,双值)=0;
虚拟双getOutput(结构成员枚举输出)常量=0;
};
样板
类模型:公共接口
{
...
};
这样做的缺点是,如果我想使用一个新的dll文件,我需要包含一个新的头文件,用相关的结构类型创建一个新的Model实例,并用结构的成员定义一个新的枚举。。。正因为如此,动态链接库中的动态链接有点丢失

<>现在我知道C++没有反射,但我希望有一个技巧至少能简化使用我的DLL内容的过程。

我希望a已经清楚地解释了这个问题,我将非常感谢任何答案或对答案的指导

至少您需要用于要访问的dll的头文件。没有通用的方法可以知道变量的结构或内容。即使使用头文件,您也可能会被编译器实现之间的实现定义差异,甚至是编译DLL时激活的编译器开关所影响

简而言之:做你想做的事没有安全的方法。


如果DLL旨在让您访问私有变量的成员,那么它应该为您提供访问器函数来获取和设置各种值。

至少您需要访问DLL的头文件。没有通用的方法可以知道变量的结构或内容。即使使用头文件,您也可能会被编译器实现之间的实现定义差异,甚至是编译DLL时激活的编译器开关所影响

简而言之:做你想做的事没有安全的方法。


如果DLL旨在让您访问私有变量的成员,那么它应该为您提供访问函数来获取和设置各种值。

每个问题都可以通过额外的间接寻址级别来解决。创建一个接口,为它们创建两个实现。以及实例化正确实现的类工厂。每个问题都通过额外的间接层来解决。创建一个接口,为它们创建两个实现。还有一个实例化正确实现的类工厂。。。
GetProcAddress(libraryHandle,“structName.member”)
可能有效吗?@Stonegoat,这是极不可能的。但是,不确定在windows DLL的符号表中可以找到什么。应该很快去尝试。快速思考我的问题。。。
GetProcAddress(libraryHandle,“structName.member”)
可能有效吗?@Stonegoat,这是极不可能的。但是,不确定在windows DLL的符号表中可以找到什么。应该很快去尝试。