2 wentionchyq wentionchyq 于 2014.02.20 21:03 提问

vc调用matlab生成的com组件返回值不成功

大虾们好,谁能帮帮我。我在设置好vc和matlab环境之后,先通过简单的程序进行了测试,可以实现调用,eg:function z=add(x+y),不论输入参数是数组还是标量都能成功。但是在将复杂的matlab程序做成com组件之后,用vc调用。得不到正确的结果。下面我将贴出简单的程序和复杂的多输入程序给大虾们帮我分析。

function z=add(x+y)
‘inline code’
HRESULT hr;
hr=CoCreateInstance(CLSID_add1,NULL,CLSCTX_ALL,IID_Iadd1,(void **)&p_Test);
if(FAILED(hr))
{
AfxMessageBox("failed");
return;
}

VARIANT x,y,z;
SAFEARRAYBOUND xBound[1],yBound[1];
SAFEARRAY *xArrayPr,*yArrayPr,*zArrayPr;
double HUGEP *xdata,*ydata,*zdata;
xBound[0].cElements=3,xBound[0].lLbound=0;
xArrayPr=SafeArrayCreate(VT_R8,1,xBound);
yBound[0].cElements=3,yBound[0].lLbound=0;
yArrayPr=SafeArrayCreate(VT_R8,1,yBound);
HRESULT hr1,hr2;
hr1=SafeArrayAccessData(xArrayPr,(void HUGEP**)&xdata);
hr2=SafeArrayAccessData(yArrayPr,(void HUGEP**)&ydata);
for(int i=0;i<3;i++)
{
    xdata[i]=(double)i;ydata[i]=(double)i+10;

}
SafeArrayUnaccessData(xArrayPr);
SafeArrayUnaccessData(yArrayPr);
VariantInit(&x);
x.vt=VT_R8|VT_ARRAY;
x.parray=xArrayPr;
VariantInit(&y);
y.vt=VT_R8|VT_ARRAY;
y.parray=yArrayPr;
hr=p_Test->add(1,&z,x,y);

LONG zBoundL,zBoundU;
zArrayPr=z.parray;
SafeArrayGetLBound(zArrayPr,2,&zBoundL);
SafeArrayGetUBound(zArrayPr,2,&zBoundU);

double z0[3];
HRESULT hr3=SafeArrayAccessData(zArrayPr,(void** HUGEP)&zdata);
for(int t=0;t<3;t++)
{
    z0[t]=zdata[t];
}

m_1=z0[0];
m_2=z0[1];
m_3=z0[2];
UpdateData(false);
SafeArrayUnaccessData(zArrayPr);

SafeArrayDestroy(xArrayPr);
SafeArrayDestroy(yArrayPr);
SafeArrayDestroy(zArrayPr);

对这个com组件的调用能够成功。

下面是对我项目中的程序进行调用,我失败了,希望有人能够帮帮我。

‘inline code’
考虑到大侠们的感受,我这里只贴出部分参数的设定,

HRESULT hr;
hr=CoCreateInstance(CLSID_test01,NULL,CLSCTX_ALL,IID_Itest01,(void **)&m_pTest);
if(FAILED(hr))
{
    AfxMessageBox("failed");
    return;
}

VARIANT GST,GSTm,Heat,Heatm,Up_thR,Up_thRm,Up_elec,Up_elecm,Down_elec,Down_elecm,Precision,Fmin,Write01,R;
SAFEARRAYBOUND GSTBound[1],GSTmBound[1],HeatBound[1],HeatmBound[1],Up_thRBound[1],Up_thRmBound[1],Up_elecBound[1],Up_elecmBound[1];Down_elecBound[1],Down_elecmBound[1],PrecisionBound[1];
SAFEARRAY *GSTArrayPr,*GSTmArrayPr,*HeatArrayPr,*HeatmArrayPr,*Up_thRArrayPr,*Up_thRmArrayPr;
SAFEARRAY *Up_elecArrayPr,*Up_elecmArrayPr,*Down_elecArrayPr,*Down_elecmArrayPr,*PrecisionArrayPr;

double HUGEP GSTdata;
double gst[3]={300,300,120};
GSTBound[0].cElements=3,GSTBound[0].lLbound=0;
GSTArrayPr=SafeArrayCreate(VT_R8,1,GSTBound);
HRESULT hr1;
hr1=SafeArrayAccessData(GSTArrayPr,(void HUGEP
*)&GSTdata);
for(int i0=0;i0<3;i0++)
{
GSTdata[i0]=gst[i0];
}
SafeArrayUnaccessData(GSTArrayPr);
VariantInit(&GST);
GST.vt=VT_R8|VT_ARRAY;
GST.parray=GSTArrayPr;

VARIANT addrin,addout;
addrin.vt=VT_BSTR;
addrin.bstrVal=_com_util::ConvertStringToBSTR("'D:\MATLAB6.5\work3\pulse_rst.txt'");
addout.vt=VT_BSTR;
addout.bstrVal=_com_util::ConvertStringToBSTR("'D:\MATLAB6.5\work3'");
hr=m_pTest->elec_mini3(1,&R,GST,GSTm,Heat,Heatm,Up_elec,Up_elecm,Down_elec,Down_elecm,Up_thR,Up_thRm,Precision,Fmin,Write01,addrin,addout);
m_R=R.dblVal;
UpdateData(false);

运行结果得到的没有初始化的R.dblVal=-9.255……;调试的时候出现了User breakpoint called from code at 0X7C9120e的错误。
在下很急,希望有人看到这个后能帮帮我。

1个回答

wentionchyq
wentionchyq   2014.03.03 16:24

我自己已经搞定了,是字符串的传递出现了问题。版主可以删帖了。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
VS2015 MATLAB混合编程之COM组件
原地址:VS2015 MATLAB混合编程之COM组件_梦中萤火虫_新浪博客  http://blog.sina.com.cn/s/blog_8d5bae080102x792.html 概述:利用m文件生成dll再由vs2015的c#程序调用。 1:matlab编译器设置 在Command Window窗口中输入mex-setup和mbuild –setup查看编译器,如果没有,需将编辑器设
基于COM接口的VC++与MATLAB混合编程
基于COM接口的VC++与MATLAB混合编程 http://www.cppblog.com/3522021224/archive/2007/06/11/26046.html 0  引言     目前,Matlab广泛的应用于自动控制、数学运算、信号分析、图像处理、财务分析等各行各业。MATLAB也存在着某些缺点:Matlab是一种解释性语言,其特点是以矩阵为基本数据结构,导致其执行效率相对
VC编译器使用Matlab_Com组件的方法
本文根据作者亲自在VISUAL C++ 6.0编译器环境下,实现了MATLAB中COM组件的开发而写成。此方法的实现是在网上各位前辈的基础上完成的。现在,就具体谈一下怎么把一个M文件或MEX文件,做成可以脱离MATLAB环境的COM组件,并且被VC++调用。1.  首先,设置合适的编译器。在MATLAB命令窗口里敲:mbuild –setup 和 mex –setup,完成编译器的设置。●
vc中调用Com组件的五种方法详解
vc中调用Com组件的方法详解 转载自:http://www.cppblog.com/woaidongmao/archive/2011/01/10/138250.html 需求: 1.创建myCom.dll,该COM只有一个组件,两个接口:    IGetRes--方法Hello(),    IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库
matlab下做com组件
邓科峰 dkf03@mails.tsinghua.edu.cn                                           matlab的combuilder系列-matlab下做com组件 com builder是matlab6.5才有的,也是mathworks公司推荐使用于混合编程的,这些日子我对他进行了全方位的摸索,感觉是爽呆了,下面我们一起来揭开它的神秘面纱,^_
VC调用COM组件的几种方法
这篇的内容也是我在使用COM组件的时候遇到困难后在网上找的一些调用的方法,以备后用。 1.首先创建一个COM组件:myCom.ocx    组件里面有一个普通接口:ImyCom   一个方法为:Hello(); 事件接口:ImyComEVT   一个事件为:HelloEvt();
在VC中调用VB编写的COM组件范例
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 先说说VB开发一个COM组件。 用VB新建一个ActiveX DLL 工程, 然后修改工程名称为 MyVB 再修改默认的类名为 DEMO 然后再向类中添加一个函数作为测试用
COM组件开发(四)——VC++调用COM组件的方法
ActiveX 控件          对于ActiveX控件,可以在Visual Studio中使用ClassWizard的方法引入,在MFC项目中选择菜单“项目”——> “添加类”——>“ActiveX控件中的MFC类”,然后可以分别从注册表和文件两种方式中选择自己想要的组件。选择注册表中的方式获取的都是在本系统中注册了的组件,而文件则是从磁盘目录下获取COM组件。 代
VC6创建COM组件,Qt调用例子
一、建立 ATL 工程   步骤2.1:建立一个工作区(WorkSpace)。   步骤2.2:在工作区中,建立一个 ATL 工程(Project)。示例程序叫 June12,并选择DLL方式,见图一。 图一、建立 ATL DLL 工程   Dynamic Link Library(DLL) 表示建立一个 DLL 的组件程序。   Executable(EXE)
总结一下在VC中调用COM组件的方法+++VC调用远程COM+组件
总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程内服务器,DLL名为simpCOM.dll,该组件只有一个接口IFoo,该接口只有一个方法HRESULT SayHello(void) 在SDK中调用 ===================================== 一、最简单最常用的一种,用#import导入类型库,利用VC提供的智