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
在Delphi中使用MatlabDLL需要做什么_Matlab_Delphi_Dll - Fatal编程技术网

在Delphi中使用MatlabDLL需要做什么

在Delphi中使用MatlabDLL需要做什么,matlab,delphi,dll,Matlab,Delphi,Dll,我正在做一个项目,在那里我得到了一个DLL,它是在matlab中创建的,它的源代码是一个matlab.m文件。我知道要使用matlab.ddl,我需要安装matlab运行时编译器。我已经这样做了 这是我需要知道的下一步 通过阅读本文中的另一篇文章,我可以看到,首先我需要初始化运行时,然后初始化每个DLL。我不确定这样做的正确方法。我已经做了一个新的单元,但我不确定如何去完成它,以便我可以使用DLL中包含的函数 单位代码如下: unit MatLabIF; interface type

我正在做一个项目,在那里我得到了一个DLL,它是在matlab中创建的,它的源代码是一个matlab.m文件。我知道要使用matlab.ddl,我需要安装matlab运行时编译器。我已经这样做了

这是我需要知道的下一步

通过阅读本文中的另一篇文章,我可以看到,首先我需要初始化运行时,然后初始化每个DLL。我不确定这样做的正确方法。我已经做了一个新的单元,但我不确定如何去完成它,以便我可以使用DLL中包含的函数

单位代码如下:

unit MatLabIF;

interface

type

    PPAnsiChar = ^PAnsiChar;

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

    procedure openMCL;

implementation

uses

Windows,sysUtils,MMSystem,Classes,Dialogs,QuickUSB,Math,StirScanDemoApp;

{------------------------------------------------------------------------------}

procedure openMCL;

begin

    if not(mclInitializeApplication(nil,0)) then showMessage('App failed to open')
    else showMessage('App Opened Correctly')
end;
 {------------------------------------------------------------------------------}

end.
当我试图运行代码时,我收到错误消息“您的计算机缺少mclbase.dll”,我进入matlab runtime complier文件夹,找到缺少的mclbase.dll并将其复制到项目文件夹中

下次我试图运行程序时,另一个dll丢失了,这种情况还会继续发生吗?如何让delphi在matlab文件夹中查找它所需的所有dll?我是否需要在“使用”部分中添加一些类似“mcl”的说明

总之,


如何使用matlab运行时编译器在delphi中使用matlab dll

您需要DLL搜索路径才能找到MATLAB运行时。实现这一目标的一些方法:

  • 将MATLAB runtime文件夹添加到系统路径。这是一种非常严厉的做法,通常是要避免的。对于您个人使用,这是最方便的
  • 使用
    SetDllDirectory
    AddDllDirectory
    扩展搜索路径 只有在加载程序尝试加载DLL之前可以调用这些函数时,才可以使用选项2。这对于加载时间链接是不可能的。您可以使用以下技术之一处理此问题:

    • 将代码移动到单独的模块中,并从主机调用其中一个函数
    • 切换到运行时链接,使用
      LoadLibrary
    • 使用带有
      delayed
      指令的延迟加载链接

    请注意,变量名
    A
    B
    的选择较差。不要让代码难以遵循。此外,该函数的第一个参数是指向以null结尾的字符串的指针。这是一个字符串数组。使用
    PPAnsiChar

    您可以将包含matlab DLL的目录添加到您的系统路径环境变量中。我觉得在单元代码的“使用”部分应该有一个条目。不要混淆Delphi
    使用
    指令和DLL搜索路径。这些事情之间的关联不能少。您还应该避免使用无意义的参数名称。是什么让你选择了
    A
    B
    ?函数为
    bool mclinitializapplication(常量字符**选项,整数计数)。一个结果是,在Delphi代码中,第一个参数应该是
    PPAnsiChar
    。我觉得它们相关的原因是,例如,uses部分中的“QuickUSB”条目允许我从QuickUSB库调用函数。你能解释一下区别吗?我不认为我使用的是加载时间链接,虽然我不完全确定这意味着什么,但你是说在应用程序启动后立即加载dll吗?因为我没有这样做,我可以随时打开matlab运行时,应用程序并不依赖于它。您使用的是加载时链接。这就是使用
    外部
    指令得到的结果。除非您添加
    延迟
    。如果您不确定加载时间链接是什么,很容易找到。你只需要把它输入一个网络搜索引擎。好的,谢谢你的回答,大卫,我想我需要学很多东西才能让它发挥作用。出于兴趣,如果我真的决定将matlab runtime文件夹添加到系统路径中,这意味着什么,将文件夹放在项目目录中?不,您不会移动任何文件。您可以修改名为
    PATH
    的系统环境变量。shell提供了一个用于设置环境变量的UI,但是我使用一个名为Rapid Environment Editor的工具来实现这一点?它是否知道如何查找文件系统以找到它需要的内容?