【问题标题】:Modelica External C function call using a DLL使用 DLL 调用 Modelica 外部 C 函数
【发布时间】:2015-11-18 19:08:22
【问题描述】:

我在 Dymola 中通过两个 DLL 处理两个外部函数。我遇到了一个问题,让我思考编译器实际上是如何找到外部函数的。因此,两个不同 DLL 中的函数具有相同的名称和相同的输入和输出变量集,但执行不同的任务。

void Execute(int in_1, bool flag_in, bool* flag_out, int* out_1);

我在Modelica的外部函数接口中定义如下:

function testFunc1 

  input Integer in_1;
  input Boolean flag_in;
  output Boolean flag_out;
  output Integer[5] out_1;

  external C Execute(int in_1, bool flag_in, bool* flag_out, int* out_1)   
  annotation(Library = "DLL1");
end testFunc1;

第二个函数在另一个名为 testFunc2 的 modelica 函数中被调用,就像上面一样。 我观察到的是,由于外部函数具有相同的名称和相同的输入和输出变量集,尽管定义了库名称,编译器会错误地从另一个 DLL 中选择错误的函数并执行它。

我想知道是否有办法强制编译器在查找外部函数时只查看特定的 DLL?或者外部函数根本不应该具有相同的名称?或者有没有更好的方法将 DLL 引入 Modelica?

【问题讨论】:

    标签: c function external modelica dymola


    【解决方案1】:

    如果您确实需要将符号命名为相同的东西,请使用 win32 API 中的 LoadLibrary 等。否则,您可能应该为跨工具和跨平台兼容性的函数指定唯一名称。

    【讨论】:

    • 感谢您的回答。我实际上并不熟悉来自 win32 API 的 LoadLibrary。您能否添加一个链接,以便我可以找到一些信息?谢谢!
    • 我只是使用 LoadLibrary 来加载 dll,只需使用 HMODULE hModule = LoadLibrary(L"C:\mylib.dll")。尽管在 VM 中找到了该库,但 dymola 无法找到它,并且 hModule 返回为 null。可能是什么原因?
    • @sjoelund.se 抱歉,我无法编辑之前的评论。
    • 尝试使用 C:/ 或 C:\\ 而不是 C:\。它是字符串,所以你需要转义字符。我得到 warning: unknown escape sequence '\m' 并且我的 C 编译器忽略了 \.
    【解决方案2】:

    库是否同时具有 DLL 和 LIB 文件或只有 DLL?

    如果有 LIB 文件,Dymola 将与之链接 - 这可能会导致上述问题,但如果没有 LIB 文件,Dymola 2016 应该直接转到 DLL。

    但使用不同的名称通常更简单。

    【讨论】:

    • 我有 DLL 和 Lib 文件。
    猜你喜欢
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多