初始化matlab DLL并从Delphi XE调用inc函数
我试图从Delphi XE 32位应用程序调用一个简单的Matlab例程,我使用Matlab 2012b编译器将其编译成一个名为Test.dll的共享C库。 例程递增一个数字并返回新值 正如我从matlab文档中了解到的,我首先需要调用mclinitializapplication。 我已将此dll调用映射如下:初始化matlab DLL并从Delphi XE调用inc函数,matlab,delphi,Matlab,Delphi,我试图从Delphi XE 32位应用程序调用一个简单的Matlab例程,我使用Matlab 2012b编译器将其编译成一个名为Test.dll的共享C库。 例程递增一个数字并返回新值 正如我从matlab文档中了解到的,我首先需要调用mclinitializapplication。 我已将此dll调用映射如下: unit mclmcrWrapper; interface type TAnsiArray = TArray<AnsiString>; PAnsiArray =
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.
function DLLInit(A: PPAnsiChar; B: integer): Boolean; cdecl;
external 'mclmcrrt8_0.dll' name 'mclInitializeApplication_proxy';
所有dll都存在于同一文件夹中。如果不是,我会得到一个错误,dll本身找不到。
这本身也很奇怪,因为Matlab编译运行时安装在我的系统上,并且它被正确地添加到windows路径中
谁能告诉我我做错了什么?
提前感谢。据我所知,该函数实际上是在
mclbase.dll
中定义的
解析链接后,我建议您更改导入函数的参数列表。将Delphi管理的类型传递给非Delphi模块是有风险的。我想这样宣布:
type
PPAnsiChar = ^PAnsiChar;
function mclInitializeApplication(A: PPAnsiChar; B: Integer): Boolean; cdecl;
external 'mclbase.dll';
据我所知,该函数实际上是在
mclbase.dll
中定义的
解析链接后,我建议您更改导入函数的参数列表。将Delphi管理的类型传递给非Delphi模块是有风险的。我想这样宣布:
type
PPAnsiChar = ^PAnsiChar;
function mclInitializeApplication(A: PPAnsiChar; B: Integer): Boolean; cdecl;
external 'mclbase.dll';
据我所知,该函数实际上是在
mclbase.dll
中定义的
解析链接后,我建议您更改导入函数的参数列表。将Delphi管理的类型传递给非Delphi模块是有风险的。我想这样宣布:
type
PPAnsiChar = ^PAnsiChar;
function mclInitializeApplication(A: PPAnsiChar; B: Integer): Boolean; cdecl;
external 'mclbase.dll';
据我所知,该函数实际上是在
mclbase.dll
中定义的
解析链接后,我建议您更改导入函数的参数列表。将Delphi管理的类型传递给非Delphi模块是有风险的。我想这样宣布:
type
PPAnsiChar = ^PAnsiChar;
function mclInitializeApplication(A: PPAnsiChar; B: Integer): Boolean; cdecl;
external 'mclbase.dll';
结果我有两件事要解决:
PPAnsiChar
而不是数组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.
function DLLInit(A: PPAnsiChar; B: integer): Boolean; cdecl;
external 'mclmcrrt8_0.dll' name 'mclInitializeApplication_proxy';
在单元中,我添加了以下代码(是的,我没有传递任何参数):
我还确保该单元是项目中第一个加载的单元,因为需要在所有其他matlab调用之前调用一次
mclinitializapplication
。事实证明,我有两件事要解决:
PPAnsiChar
而不是数组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.
function DLLInit(A: PPAnsiChar; B: integer): Boolean; cdecl;
external 'mclmcrrt8_0.dll' name 'mclInitializeApplication_proxy';
在单元中,我添加了以下代码(是的,我没有传递任何参数):
我还确保该单元是项目中第一个加载的单元,因为需要在所有其他matlab调用之前调用一次
mclinitializapplication
。事实证明,我有两件事要解决:
PPAnsiChar
而不是数组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.
function DLLInit(A: PPAnsiChar; B: integer): Boolean; cdecl;
external 'mclmcrrt8_0.dll' name 'mclInitializeApplication_proxy';
在单元中,我添加了以下代码(是的,我没有传递任何参数):
我还确保该单元是项目中第一个加载的单元,因为需要在所有其他matlab调用之前调用一次
mclinitializapplication
。事实证明,我有两件事要解决:
PPAnsiChar
而不是数组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.
function DLLInit(A: PPAnsiChar; B: integer): Boolean; cdecl;
external 'mclmcrrt8_0.dll' name 'mclInitializeApplication_proxy';
在单元中,我添加了以下代码(是的,我没有传递任何参数):
我还确保该单元是项目中第一个加载的单元,因为需要在所有其他matlab调用之前调用一次
mclinitializapplication
。确定函数名中的下划线吗?例如,在中,其名称中没有下划线。这是供应商支持团队最近发布的帖子。事实上,不,我不确定,尽管下划线经常是必需的。我也尝试了不加下划线的方式,这给了我同样的结果。我在帖子中对此进行了更新。一些名称装饰方案包括下划线。在本例中,depends告诉您没有下划线。所以不要把它包括在内。然后,当您这样做时,系统会告诉您,在动态链接库mclmcr.dll中找不到mclInitializeApplication。好吧,相信这个系统。这是正确的。那个DLL中没有这样的函数。它位于不同的DLL中。是否确定函数名中的下划线?例如,在中,其名称中没有下划线。这是供应商支持团队最近发布的帖子。事实上,不,我不确定,尽管下划线经常是必需的。我也尝试了不加下划线的方式,这给了我同样的结果。我在帖子中对此进行了更新。一些名称装饰方案包括下划线。在本例中,depends告诉您没有下划线。所以不要把它包括在内。然后,当您这样做时,系统会告诉您,在动态链接库mclmcr.dll中找不到mclInitializeApplication。好吧,相信这个系统。这是正确的。那个DLL中没有这样的函数。它位于不同的DLL中。是否确定函数名中的下划线?例如,在中,其名称中没有下划线。这是供应商支持团队最近发布的帖子。事实上,不,我不确定,尽管下划线经常是必需的。我也尝试了不加下划线的方式,这给了我同样的结果。我在帖子中更新了这个。一些名字装饰方案