【发布时间】:2014-03-27 23:42:31
【问题描述】:
我正在尝试从 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 路径中。
谁能告诉我我做错了什么? 提前致谢。
【问题讨论】:
-
你确定函数名中的下划线吗?例如,
this answer的名称中没有下划线。这是供应商支持团队最近发布的帖子。 -
实际上,不,我不确定,尽管通常需要下划线。我也尝试不使用下划线,这给了我相同的结果。我已经在帖子中更新了。
-
一些名称装饰方案包括下划线。在这种情况下,depends 告诉您没有下划线。所以不要包括它。然后,当您这样做时,系统会告诉您 mclInitializeApplication 无法位于动态链接库 mclmcr.dll 中。好吧,相信系统。它是正确的。该DLL中没有这样的功能。它位于不同的 DLL 中。