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。
|