C++Buider2010调用Matlab2010a编译的DLL

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

自从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。
...全文
4188 64 打赏 收藏 转发到动态 举报
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
duozhily 2021-07-14
  • 打赏
  • 举报
回复

楼主好,我用您的方法调用matlab函数后,出现‘Access Violation ’的错误,不知如何是好了

u010650029 2013-05-15
  • 打赏
  • 举报
回复
我正在用BCB6.0调用matlab的dll,一直做不对,不知有什么区别?可否也发我一份图文并茂的?万分感谢!!!邮箱:1050162195@qq.com
haibiantingtao 2013-04-23
  • 打赏
  • 举报
回复
楼主文档可以发我一份吗?我的邮箱haibiantingtao@yahoo.com.cn 万分感谢
nilwade 2013-03-18
  • 打赏
  • 举报
回复
LZ我参照了一下你的方法,但是最后提示有部分函数无法找到,估计是lib的缘故 从你的步骤,你主要用到的是mclmcrrt.lib。怀疑MAtlab2009R+CB6.0和LZ的软件配置之间的差别 不知道LZ试过别的版本下做混合吗?
ltioaf001 2012-09-02
  • 打赏
  • 举报
回复
两个月没上网了,支持下咱们论坛
o悟空o 2012-08-25
  • 打赏
  • 举报
回复
谢谢楼主,众里寻他千百度。谢谢
wenchaohua 2011-12-03
  • 打赏
  • 举报
回复
hao
qq916771394 2011-10-30
  • 打赏
  • 举报
回复
916771394@qq.com发给我一份,楼主,谢谢
yzlyzq123 2011-10-11
  • 打赏
  • 举报
回复
好东西啊,牛人
bolly1986518 2011-07-16
  • 打赏
  • 举报
回复
楼主,我的邮箱是bolly1986518@163.com,希望能和您联系一下,QQ676742647,讨论一下这种联合编程的利弊以及其他方法。
Qiu___Meng 2011-06-27
  • 打赏
  • 举报
回复
楼主,求图文并茂。qqm7389190@126.com 非常感谢
Qiu___Meng 2011-06-27
  • 打赏
  • 举报
回复
楼主,求图文并茂。qqm7389190@126.com 非常感谢
rickys2080 2011-05-07
  • 打赏
  • 举报
回复
好好好好好好好好好好好好好
jaffy 2011-04-07
  • 打赏
  • 举报
回复
我也想要一份!
dong2gua 2011-02-22
  • 打赏
  • 举报
回复
谢谢楼主 请发一份给我 dong2gua@hotmail.com 好人一生平安!
BORLANDSUN 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用 63 楼 chippy 的回复:]
估计楼主刚用C++Builder!
[/Quote]
不知您说这话是什么意思?我用CB时间的确不长,也就是从5.0开始用起,到现在也就10年左右。以前的3.0和4.0经典版本没赶上,Borland C更是只在刚上大学时学C++在机房里玩过,没有真正用过,遗憾遗憾。自从ChinaBCB关站后就来这边混分了,工具上VC也用CB也用。
我只不过是弄出来个东西帖一下而已,没得罪您什么吧?
另外各位要文档的同志,我刚刚发过去了,请查收一下。
chippy 2011-01-17
  • 打赏
  • 举报
回复
估计楼主刚用C++Builder!
zhenruoshui 2011-01-17
  • 打赏
  • 举报
回复
很不错的分享,好东西!!!
gao120628 2011-01-17
  • 打赏
  • 举报
回复
很不错的分享啊
魔方幻影 2011-01-17
  • 打赏
  • 举报
回复
dz881122@126.com。谢谢!
加载更多回复(44)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧