从 C++ 运行时加载的 DLL 访问结构的成员

Accessing members of a structure from a DLL, loaded at runtime in C++

提问人:lechrizzle 提问时间:10/21/2020 更新时间:10/21/2020 访问量:130

问:

我有以下问题:在运行时,我加载了 Matlab 生成的 Simulink 模型的 DLL,其中包含模型输出和输入的结构以及一些方法。

生成的结构和方法示例(模型的名称为“Test_Scalar”):

typedef struct {
  real_T Input_1;                    /* '<Root>/Input_1' */
  real_T Input_2;                    /* '<Root>/Input_2' */
} ExtU_Test_Scalar_T;

/* External outputs (root outports fed by signals with default storage) */
typedef struct {
  real_T Output;                      /* '<Root>/Output' */
} ExtY_Test_Scalar_T;

/* Real-time Model Data Structure */
struct tag_RTM_Test_Scalar_T {
  const char_T * volatile errorStatus;
};

/* External inputs (root inport signals with default storage) */
extern ExtU_Test_Scalar_T Test_Scalar_*;

/* External outputs (root outports fed by signals with default storage) */
extern ExtY_Test_Scalar_T Test_Scalar_Y;

/* Model entry point functions */
extern void Test_Scalar_initialize(void);
extern void Test_Scalar_step(void);
extern void Test_Scalar_terminate(void);

在我的 C++ 程序中,我可以加载和执行 init 函数,并且我还获得了指向结构的指针。 但是,我不知道如何访问结构的成员。这里有人有想法吗?

int main() {
    HMODULE hModule = LoadLibraryA("C:\\....\\Test_Scalar_win64.dll");
    assert(hModule);

    FARPROC initialize = GetProcAddress(hModule, "Test_Scalar_initialize");
    assert(initialize);
    initialize();

    FARPROC inputs= GetProcAddress(hModule, "Test_Scalar_U");
    assert(inputs);

    //accessing members of input struct here
}

诚挚的问候
克里斯

C++ MATLAB DLL Simulink getprocaddress

评论

1赞 Alan Birtles 10/21/2020
只是把它扔给?ExtU_Test_Scalar_T*
0赞 lechrizzle 10/21/2020
我认为类型“ExtU_Test_Scalar_T”是未知的,因为我不包含标头。访问应该尽可能通用,所以我只知道结构有多少个成员以及它们有什么类型。
0赞 Alan Birtles 10/21/2020
为什么不包含标题?
0赞 lechrizzle 10/21/2020
我们希望实现一个通用的 C++ 文件,作为任何 Simulink 模型的 Java JNI 访问点。对于此类,我们只想传递输入和输出的数量和类型(当然还有动态加载的 DLL 文件的路径以及生成的方法和结构的命名所基于的模型的名称)。此 C++ 文件也应转换为 DLL 一次。此 DLL 将通过 JNI 从 Java 调用。因此,对结构的访问应该在运行时完成,而在编译时没有标头 include。
0赞 Alan Birtles 10/21/2020
然后,您必须编写代码来计算结构偏移量并对单个成员进行 memcpy,如果您想更可靠地执行此操作,最好导出访问器方法

答: 暂无答案