Delphi如何做一个dll、然后返回一个数组供其他的程序调用。
1个回答
展开全部
一 、Matlab本身并没有提供与Delphi的应用程序接口,但是提供了基于win32平台的VC++应用程序接口,包括Matlab引擎(engine),C/C++函数库。可以利用Matlab与VC++的接口函数,通过matlab引擎进行指令处理和数据传递,编写出C++语言的动态连接库,作为Matlab与Delphi的接口,然后在Delphi中进行C++动态库函数的调用。Matlab引擎的C语言调用函数如下:
函数名 功 能
EngOpen 打开Matlab引擎
EngEvalString 在Matlab引擎中执行一条命令
EngPutArray 将数据放入Matlab引擎
EngGetArray 从Matlab引擎中取出数据
EngClose 关闭Matlab引擎
在使用Matlab引擎函数时,要用到Matlab数组(mxArray),Matlab引擎利用这个数据类型来进行各种数据处理工作。Matlab中的各种变量,包括标量、矢量、矩阵、字符串等都是用这种Matlab数组来进行存储的。Matlab提供了C语言下的Matlab数组(mxArray)的格式,定义了它的数据结构。Delphi下没有对应的Matlab数组,但利用动态连接库可以巧妙地解决这个问题。
二、动态连接库的设计
将Delphi中的数据送入Matlab进行分析,选择合适的处理函数后进行运算,然后将结果送回Delphi。为了实现上述目的,可以设计相应的几个函数。这些函数都放在DpLab.dll动态连接库中。DpLab.dll的基本组成如下:
(1)头函数
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h" //在Matlab\extern\include下,将它拷入当前目录
engine *ep=NULL; //Matlab引擎,全局变量
mxArray *PA=NULL; //Matlab数组指针。可根据需要定义多个mxArray指针变量
(2)打开Matlab引擎函数:
extern"C" declspec(dllexport)int MatOpenEng(far char *cc)
{
if(ep) return 0;//如果已打开则退出
if(!(ep=engOpen(cc))) return -1;
else return 1;
}
如果Matlab安装在本地计算机上,字符串cc中的内容为“\0”,如果系统为客户机/服务器(Client/Server)的工作方式,Matlab安装在主机“host”上,可输入'\\host\Matlib'。
(3)关闭Matlab引擎的函数
extern"C" declspec(dllexport)int MatCloseEng(void)
{
if(ep)
{
if(PA) mxDestroyArray(PA);//释放PA
engClose(ep);
ep=NULL;
return1;
}
else return0;
}
(4)执行Matlab命令函数
extern"C" declspec(dllexport)int MatExec(far char *cc)
{
if(!ep)return0;
engEvalString(ep,cc);//cc中放Matlab命令return 1;
}
(5)根据已知数据创建mxArray变量
//注:cc:Matlab变量名 num:数据的个数 dd:已知数据
extern"C" declspec(dllexport)int MatCreateDoubleD(char *cc,int num,double dd[])
{
if(!ep) return 0;
if(num<1) return -1;
PA=mxCreatedoubleMatrix(1,num,mxREAL);
mxSetName(PA,fh[Getfh(cc)]);//指定Matlab中变量名,它必须是静态字符串!
memcpy((char *)mxGetPr(PA),(char *)dd,num * sizeof(double));
engPutArray(ep,PA);
return1;
}
(6)获取Matlab数据
//注:cc:Matlab变量名 num:数据的个数 dd:返回数据
extern"C" declspec(dllexport)int MatGetdoubleData(char *cc,int num,double dd[])
{
mxArray result;
double pData;
int i;
if(!ep)return0;
if(num<1)return-1;
result=engGetArray(ep,fh[Getfh(cc)]);
if(result)
{
pData=(double )mxGetData(result);
for(i=0;i<num;i++) dd[i]=pData[i];
mxDestroyArray(result);
return1;
}
return 0;
}
剩下的自己发挥...
其实,就是要花费一定时间编写相关的dll
函数名 功 能
EngOpen 打开Matlab引擎
EngEvalString 在Matlab引擎中执行一条命令
EngPutArray 将数据放入Matlab引擎
EngGetArray 从Matlab引擎中取出数据
EngClose 关闭Matlab引擎
在使用Matlab引擎函数时,要用到Matlab数组(mxArray),Matlab引擎利用这个数据类型来进行各种数据处理工作。Matlab中的各种变量,包括标量、矢量、矩阵、字符串等都是用这种Matlab数组来进行存储的。Matlab提供了C语言下的Matlab数组(mxArray)的格式,定义了它的数据结构。Delphi下没有对应的Matlab数组,但利用动态连接库可以巧妙地解决这个问题。
二、动态连接库的设计
将Delphi中的数据送入Matlab进行分析,选择合适的处理函数后进行运算,然后将结果送回Delphi。为了实现上述目的,可以设计相应的几个函数。这些函数都放在DpLab.dll动态连接库中。DpLab.dll的基本组成如下:
(1)头函数
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h" //在Matlab\extern\include下,将它拷入当前目录
engine *ep=NULL; //Matlab引擎,全局变量
mxArray *PA=NULL; //Matlab数组指针。可根据需要定义多个mxArray指针变量
(2)打开Matlab引擎函数:
extern"C" declspec(dllexport)int MatOpenEng(far char *cc)
{
if(ep) return 0;//如果已打开则退出
if(!(ep=engOpen(cc))) return -1;
else return 1;
}
如果Matlab安装在本地计算机上,字符串cc中的内容为“\0”,如果系统为客户机/服务器(Client/Server)的工作方式,Matlab安装在主机“host”上,可输入'\\host\Matlib'。
(3)关闭Matlab引擎的函数
extern"C" declspec(dllexport)int MatCloseEng(void)
{
if(ep)
{
if(PA) mxDestroyArray(PA);//释放PA
engClose(ep);
ep=NULL;
return1;
}
else return0;
}
(4)执行Matlab命令函数
extern"C" declspec(dllexport)int MatExec(far char *cc)
{
if(!ep)return0;
engEvalString(ep,cc);//cc中放Matlab命令return 1;
}
(5)根据已知数据创建mxArray变量
//注:cc:Matlab变量名 num:数据的个数 dd:已知数据
extern"C" declspec(dllexport)int MatCreateDoubleD(char *cc,int num,double dd[])
{
if(!ep) return 0;
if(num<1) return -1;
PA=mxCreatedoubleMatrix(1,num,mxREAL);
mxSetName(PA,fh[Getfh(cc)]);//指定Matlab中变量名,它必须是静态字符串!
memcpy((char *)mxGetPr(PA),(char *)dd,num * sizeof(double));
engPutArray(ep,PA);
return1;
}
(6)获取Matlab数据
//注:cc:Matlab变量名 num:数据的个数 dd:返回数据
extern"C" declspec(dllexport)int MatGetdoubleData(char *cc,int num,double dd[])
{
mxArray result;
double pData;
int i;
if(!ep)return0;
if(num<1)return-1;
result=engGetArray(ep,fh[Getfh(cc)]);
if(result)
{
pData=(double )mxGetData(result);
for(i=0;i<num;i++) dd[i]=pData[i];
mxDestroyArray(result);
return1;
}
return 0;
}
剩下的自己发挥...
其实,就是要花费一定时间编写相关的dll
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询