Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重命名从dll导入的结构的字段_C++_C_Dll - Fatal编程技术网

C++ 重命名从dll导入的结构的字段

C++ 重命名从dll导入的结构的字段,c++,c,dll,C++,C,Dll,我正在为一系列编译的Simulink模型(它们是生成到C DLL中的代码)构建一个框架。在每个dll中都有入口点,您可以使用这些入口点访问模拟的输入和输出,例如,它们可以如下所示(从dll的头文件): 然而,即使所有模型具有相同的I/O数据结构(Ms_MainBus),实际变量名称也会发生变化,因此,例如,在另一个dll中,信号可能被称为Ms_MainBus_b,而不是Ms_MainBus_a。这是非常烦人的,因为我试图构建一个通用框架来处理大量的这些模型,并且不需要知道Matlab在信号名称后

我正在为一系列编译的Simulink模型(它们是生成到C DLL中的代码)构建一个框架。在每个dll中都有入口点,您可以使用这些入口点访问模拟的输入和输出,例如,它们可以如下所示(从dll的头文件):

然而,即使所有模型具有相同的I/O数据结构(Ms_MainBus),实际变量名称也会发生变化,因此,例如,在另一个dll中,信号可能被称为
Ms_MainBus_b
,而不是
Ms_MainBus_a
。这是非常烦人的,因为我试图构建一个通用框架来处理大量的这些模型,并且不需要知道Matlab在信号名称后面加了什么字母

为了解决这个问题,我尝试了以下方法:

定义了一个结构,该结构具有我希望每个模型都使用的信号名称

typedef struct {
   Ms_MainBus MainBus;
} stdInput;
然后,我继续将输入和输出变量从dll导入一个名为Ele的类

在Ele.h中,我首先尝试覆盖头文件中的输入结构

#undef ExternalOutputs_vcts_electrical
#define ExternalOutputs_vcts_electrical stdOutput
然后声明输入变量

ExternalOutputs_vcts_electrical (*output);
和在Ele.cpp中

this->output = (ExternalOutputs_vcts_electrical*)GetProcAddress(this->lib, "vcts_electrical_Y");
它可以工作,并且我可以访问
output.MainBus
,但是如果我尝试更改模型的输入值,什么也不会发生。这就像dll使用了我的代码以外的另一个工作区。在我开始这个重命名业务之前,我没有遇到过这个问题,所以我猜问题出在
#unde,#define
部分,对吗


我该怎么做?

输出的声明作为指向外部输出电气的指针,不是指向返回
ExternalOutputs\u vcts\u electrical
的函数的指针。首先
ExternalOutputs\u vcts\u electrical
是一种类型而不是
\define
我怀疑预处理器是否会用库的
externaloutpus\u vcts\u electrical
替换它。第二个
外部输出\u vcts\u电气(*输出)这本质上意味着指向结构实例的指针。因此,
this->output=(ExternalOutputs\u vcts\u electrical*)GetProcAddress(this->lib,“vcts\u electrical”)这是完全错误的(您将func ptr带入实例ptr),除非您使用适当的参数将其类型转换为适当的调用约定。你能把“vcts_electrical_Y”的函数签名贴到这个函数上吗?如果你不喜欢.h文件,就编辑它。如果DLL所有者更改了它,请准备多次执行此操作。因此,您可能不想让他对您的更改一无所知。如果数据类型相同,并且标签是唯一更改的内容,您可以强制转换为预定义的结构类型。是的,Dogbert,您完全正确。:)不敢相信我以前没有意识到这一点,但是我被从代码生成中得到的头/dll的(我觉得非常奇怪)体系结构搞糊涂了。我构建了getter/setter,现在可以转换为普通类型,并且工作得非常出色。谢谢不能对你的评论投赞成票,否则我会的。
this->output = (ExternalOutputs_vcts_electrical*)GetProcAddress(this->lib, "vcts_electrical_Y");