初始化matlab dll并从Delphi XE调用inc函数

时间:2014-01-28 10:16:41

标签: matlab delphi

我正在尝试从Delphi XE 32位应用程序调用一个简单的Matlab例程,我已使用Matlab 2012b编译器将其编译为一个名为Test.dll的共享C库。 例程递增一个数字并返回新值。

据我从matlab文档中了解到,我首先需要调用mclInitializeApplication。 我已按如下方式映射此dll调用:

unit mclmcrWrapper;

interface

type
  TAnsiArray = TArray<AnsiString>;
  PAnsiArray = ^TAnsiArray;

  function mclInitializeApplication(A: PAnsiArray; B: Integer): Boolean; cdecl; external 'mclmcr.dll' name '_mclInitializeApplication'; 

  // Also tried, with same result:
  // All attempts made with and without underscore give the same results.
  // function mclInitializeApplication(A: PAnsiArray; B: Integer): Boolean; cdecl; external 'mclmcr.dll' name '_mclInitializeApplication'; 
  // function mclInitializeApplication(A: THandle; B: Integer): Boolean; cdecl; external 'mclmcr.dll' name '_mclInitializeApplication'; 

implementation

initialization
  mclInitializeApplication(nil, 0); //Initialize the matlab runtime
end.

根据ddlDepends,函数存在于dll中。 当我执行我的程序时,我收到以下错误消息:

---------------------------
MatlabTest.exe - Entry Point Not Found
---------------------------
The procedure entry point _mclInitializeApplication could not be located in the dynamic link library mclmcr.dll. 
---------------------------
OK   
---------------------------

所有dll都出现在同一个文件夹中。如果他们不是我得到一个错误,无法找到DLL本身。 本身也很奇怪,因为Matlab编译的运行时安装在我的系统上,并且它被正确地添加到Windows路径中。

谁能告诉我我做错了什么? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

据我所知,该功能实际上是在mclbase.dll中定义的。

解决链接后,我建议您更改导入功能的参数列表。将Delphi托管类型传递给非Delphi模块是有风险的。我会这样声明:

type
  PPAnsiChar = ^PAnsiChar;

function mclInitializeApplication(A: PPAnsiChar; B: Integer): Boolean; cdecl;
  external 'mclbase.dll';

答案 1 :(得分:0)

事实证明我有几件事需要解决:

  1. 正确安装MCR。
  2. 传递PPAnsiChar而不是数组
  3. 在mclmcrrt8_0.dll中调用“_proxy”函数,而不是其他dll文件中的常规函数​​。
  4. 方法声明现在如下:

    function DLLInit(A: PPAnsiChar; B: integer): Boolean; cdecl;
      external 'mclmcrrt8_0.dll' name 'mclInitializeApplication_proxy';
    

    在单元中我添加了以下代码(是的,我没有传递任何参数):

    initialization
    
    if not DLLInit(@MyString, 0) then
      raise Exception.Create('Could not initialize Matlab library.');
    

    我还确保该单元是第一个在项目中加载的单元,因为mclInitializeApplication需要在所有其他matlab调用之前调用。