Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初始化matlab DLL并从Delphi XE调用inc函数_Matlab_Delphi - Fatal编程技术网

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

初始化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 =

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

正如我从matlab文档中了解到的,我首先需要调用mclinitializapplication。 我已将此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.
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';

结果我有两件事要解决:

  • 正确安装MCR
  • 传递
    PPAnsiChar
    而不是数组
  • 调用mclmcrrt8_0.dll中的“_proxy”函数,而不是其他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.
    
    function DLLInit(A: PPAnsiChar; B: integer): Boolean; cdecl;
      external 'mclmcrrt8_0.dll' name 'mclInitializeApplication_proxy';
    
    在单元中,我添加了以下代码(是的,我没有传递任何参数):


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

    事实证明,我有两件事要解决:

  • 正确安装MCR
  • 传递
    PPAnsiChar
    而不是数组
  • 调用mclmcrrt8_0.dll中的“_proxy”函数,而不是其他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.
    
    function DLLInit(A: PPAnsiChar; B: integer): Boolean; cdecl;
      external 'mclmcrrt8_0.dll' name 'mclInitializeApplication_proxy';
    
    在单元中,我添加了以下代码(是的,我没有传递任何参数):


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

    事实证明,我有两件事要解决:

  • 正确安装MCR
  • 传递
    PPAnsiChar
    而不是数组
  • 调用mclmcrrt8_0.dll中的“_proxy”函数,而不是其他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.
    
    function DLLInit(A: PPAnsiChar; B: integer): Boolean; cdecl;
      external 'mclmcrrt8_0.dll' name 'mclInitializeApplication_proxy';
    
    在单元中,我添加了以下代码(是的,我没有传递任何参数):


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

    事实证明,我有两件事要解决:

  • 正确安装MCR
  • 传递
    PPAnsiChar
    而不是数组
  • 调用mclmcrrt8_0.dll中的“_proxy”函数,而不是其他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.
    
    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中。是否确定函数名中的下划线?例如,在中,其名称中没有下划线。这是供应商支持团队最近发布的帖子。事实上,不,我不确定,尽管下划线经常是必需的。我也尝试了不加下划线的方式,这给了我同样的结果。我在帖子中更新了这个。一些名字装饰方案