| 
 
| C++Buider2010调用Matlab2010a编译的DLL 
 
 一、Matlab设置
 1. 在命令行输mbuild –setup,根据提示,选择matlab自带的Lcc-win32编译器。(选哪个据个人喜好。)
 2. 编写测试文件:TestA.m
 
 function y = TestA(x)
    y = x*2;
 复制代码
 3. 用Matlab工具DeploymentTool将TestA.m文件编译为dll(C Shared Library)。编译后,将得到的TestA.dll和TestA.h文件拷出待用。
 
 二、C++ Builder设置
 1.用工具Coff2omf将$MATLAB\R2010a\extern\lib\win32\microsoft文件夹下COFF格式的mclmcrrt.lib文件转换为OMF格式。
 2.新建一个VCL Forms Application。
 3.把上边生成的OMF格式的mclmcrrt.lib添加到工程中。把TestA.h拷贝到源码文件夹下,把TestA.dll拷贝到可执行文件文件夹下。把$MATLAB\R2010a\extern\include路径添加到头文件搜索路径中。
 
 三、编写测试代码
 1.添加头文件
 
 #include “mclmcrrt.h”
#include “TestA.h”
 复制代码
 2.添加函数指针声明
 
 typedef bool (MW_CALL_CONV *pFunc)(void);
typedef bool (MW_CALL_CONV *pFunc2)(int nargout, mxArray** y, mxArray* x);
 复制代码
 3.mcl初始化
 
 mclInitializeApplication(NULL, 0);
 复制代码
 4.DLL初始化
 
 HINSTANCE hins = LoadLibrary("TestA.dll");
pFunc p = NULL;
p = (pFunc)GetProcAddress((HMODULE)hins, (LPCTSTR)"_TestAInitialize");
p();
 复制代码
 注意:DLL初始化函数的命名法则为“_”+DLL名+“Initialize”。
 5.准备数据
 
 mxArray* x;
mxArray** y;
x = mxCreateDoubleMatrix(1, 1, mxREAL);
y = new mxArray*[1];
y[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
double ix[1] = {2};
double iy[1] = {0};
memcpy(mxGetPr(x), ix, sizeof(double));
 复制代码
 6.调用matlab函数
 
 pFunc2 p2 = NULL;
p2 = (pFunc2)GetProcAddress((HMODULE)hins, (LPCTSTR)"_mlfTestA");
p2(1, y, x);
 复制代码
 注意:matlab函数的命名法则为“_mlf”+m函数名。
 7.取返回值并显示
 
 memcpy(iy, mxGetPr(y[0]), sizeof(double));
ShowMessage(String(iy[0]));
 复制代码
 8.释放相关内存
 
 mxDestroyArray(x);
mxDestroyArray(y[0]);
delete[] y;
 复制代码
 9.DLL结束
 
 p = (pFunc)GetProcAddress((HMODULE)hins, (LPCTSTR)"_TestATerminate");
p();
 复制代码
 注意:DLL结束函数的命名法则为“_”+DLL名+“Terminate”。
 10.mcl结束
 
 mclTerminateApplication();
 复制代码
 运行完成后,可得输出的值为4。
 
 | 
 |