我正在尝试从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路径中。
谁能告诉我我做错了什么? 提前谢谢。
答案 0 :(得分:3)
据我所知,该功能实际上是在mclbase.dll
中定义的。
解决链接后,我建议您更改导入功能的参数列表。将Delphi托管类型传递给非Delphi模块是有风险的。我会这样声明:
type
PPAnsiChar = ^PAnsiChar;
function mclInitializeApplication(A: PPAnsiChar; B: Integer): Boolean; cdecl;
external 'mclbase.dll';
答案 1 :(得分:0)
事实证明我有几件事需要解决:
PPAnsiChar
而不是数组方法声明现在如下:
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调用之前调用。