使用DLL调用Modelica外部C函数

使用DLL调用Modelica外部C函数,c,function,external,modelica,dymola,C,Function,External,Modelica,Dymola,我通过两个DLL使用Dymola中的两个外部函数。我遇到了一个问题,这使我想到编译器实际上是如何找到外部函数的。因此,两个不同DLL中的函数具有相同的名称以及相同的输入和输出变量集,但执行的任务不同 void Execute(int in_1, bool flag_in, bool* flag_out, int* out_1); 我在Modelica的外部函数接口中将它们定义为: function testFunc1 input Integer in_1; input Boolea

我通过两个DLL使用Dymola中的两个外部函数。我遇到了一个问题,这使我想到编译器实际上是如何找到外部函数的。因此,两个不同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

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

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

库是否同时具有DLL和LIB文件,还是仅具有DLL

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


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

库是否同时具有DLL和LIB文件,还是仅具有DLL

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


但是使用不同的名字通常比较简单。

谢谢你的回答。实际上,我并不熟悉win32 API中的LoadLibrary。你可以添加一个链接,这样我可以找到一些信息吗?谢谢我只是使用LoadLibrary加载dll,只需使用HMODULE HMODULE=LoadLibraryLC:\mylib.dll即可。虽然该库在VM中找到,但dymola无法找到它,hModule返回为null。原因可能是什么?@sjoelund.se很抱歉有这么多评论,我无法编辑以前的评论。请尝试使用C://或C:\\而不是C:\。它是字符串,因此需要转义字符。我得到警告:未知转义序列'\m',我的C编译器忽略\。谢谢你的回答。实际上,我并不熟悉win32 API中的LoadLibrary。你可以添加一个链接,这样我可以找到一些信息吗?谢谢我只是使用LoadLibrary加载dll,只需使用HMODULE HMODULE=LoadLibraryLC:\mylib.dll即可。虽然该库在VM中找到,但dymola无法找到它,hModule返回为null。原因可能是什么?@sjoelund.se很抱歉有这么多评论,我无法编辑以前的评论。请尝试使用C://或C:\\而不是C:\。它是字符串,因此需要转义字符。我收到警告:未知转义序列“\m”和我的C编译器忽略\。我有DLL和Lib文件。我有DLL和Lib文件。