首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

C++Buider2010调用Matlab2010a编译的DLL,该如何解决

2012-02-05 
C++Buider2010调用Matlab2010a编译的DLL——费尽千万波折,今日终调成功。为防日后遗忘,特意整理如下。转帖请注

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

自从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
[解决办法]

学习
[解决办法]
也给我来一份吧:mmfeng@126.com
[解决办法]
要求图文并茂的
yuanxian1@gmail.com
[解决办法]
lghndyz@126.com,学习学习!!
[解决办法]
好,我推荐一下这个帖子。
[解决办法]
收藏一下。
[解决办法]
祝贺楼主,给我发一份。wewaa@126.com
[解决办法]
好啊,总算学习到了
[解决办法]
好好学习天天向上。
向楼主学习了
[解决办法]
这个要好好学习一下了 谢谢楼主

[解决办法]
good~


[解决办法]
谢谢楼主的分享!
[解决办法]
感谢分享,经常使用matlab
[解决办法]

学习

谢谢分享
[解决办法]
wangcaiyun02@163.com
给我来一份图文并茂的吧,两个工具都用过,却没结合在一起用过
[解决办法]
留邮箱干嘛,不知道,我也留一个ggt0906@sina.cn
[解决办法]
现在还在用bcb6,没升级

热点排行