【问题标题】:Accessing struct content, when the type and its content varies between different DLL's访问结构内容,当类型及其内容在不同 DLL 之间变化时
【发布时间】:2012-06-26 07:55:35
【问题描述】:

我有这些项目,我需要在其中连接几个代码生成的 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 
{
    ...
};

这样做的缺点是,如果我想使用一个新的 dll 文件,我需要包含一个新的头文件,创建一个具有相关结构类型的新模型实例,并使用结构的成员定义一个新的枚举。 .. 正因为如此,dll 中的 dynamic 有点丢失了。

现在我知道 C++ 没有反射,但我希望得到一个提示,至少能够简化使用我拥有的 dll 内容的过程。


我希望已经清楚地解释了问题,我将非常感谢任何答案或答案方向!

【问题讨论】:

  • 每个问题都通过额外的间接层级来解决。创建一个接口,为它们制作两个实现。以及一个实例化正确实现的类工厂。

标签: c++ dll


【解决方案1】:

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

简而言之:没有安全的方法可以随心所欲。

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

【讨论】:

  • 快速思考一下我的想法...GetProcAddress(libraryHandle , "structName.member") 可能有用吗?
  • @Stonegoat,这不太可能。不过,不确定您可以在 Windows DLL 的符号表中找到什么。应该很快尝试。
猜你喜欢
  • 1970-01-01
  • 2019-02-25
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 2010-11-11
相关资源
最近更新 更多