C++Buider2010调用Matlab2010a编译的DLL,该怎么处理

C++Buider2010调用Matlab2010a编译的DLL
本帖最后由 BORLANDSUN 于 2011-01-06 20:17:37 编辑
——费尽千万波折,今日终调成功。为防日后遗忘,特意整理如下。
转帖请注明出处,谢谢!
(另:如此帖日后承蒙版主关注,麻烦请查一下我的下载分。前段时间下载了几个文档,搞半天都没下载成功,而且还扣了分。有一次分不够了,我兑了点可用分,结果依然无果而终。再兑分,又说每天只可兑一次。怒!)

自从Matlab的编译器升级到4.0版本后,用CB调m文件编译后的DLL就痛苦了,总是搞不成功。网上VC的有很多例子,只可惜绝大多数都搞不对。即使调对了,也没办法移植到CB中去。怒。
今天终于调出来了,趁现在记得清楚,也为了给坛子里其它CB的朋友提供参考,我就把步骤简单整理一下。因为无法上传图片,需要图文并茂的文档的朋友请留下邮箱。我找个时间一并发去。

废话不说,下面开始。(Matlab 2010a、C++ Builder 2010)

一、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。
------解决方案--------------------
这分接了。。
------解决方案--------------------
支持楼主的精神。
------解决方案--------------------
谢谢楼主,给我来份图文并茂的吧,foxdox@163.com
------解决方案--------------------
C++Buider2010调用Matlab2010a编译的DLL,该怎么处理
学习
------解决方案--------------------
也给我来一份吧:mmfeng@126.com
------解决方案--------------------
要求图文并茂的
yuanxian1@gmail.com
------解决方案--------------------
lghndyz@126.com,学习学习!!
------解决方案--------------------
好,我推荐一下这个帖子。
------解决方案--------------------
收藏一下。
------解决方案--------------------
祝贺楼主,给我发一份。wewaa@126.com
------解决方案--------------------