本帖最后由 cbao123 于 2012-7-7 11:59 编辑
本人使用MATLAB写了一个自定义函数的脚本,代码如下:function y = myadd(a,b,c) ;c参数用于验证字符串型参数的传递,与返回值无关系
y = a+b;
disp(y);
fid=fopen('char2.txt','w');此后代码用于验证本脚本是否成功调用,若成功则将y值写入char2.txt
fprintf(fid,'%d',y);
fclose(fid);
然后使用MATLAB的com工具,将上面的函数代码封装成DLL形式的com组件(对象),封装后的com接口定义如下(注:封装原理是将MATLAB脚本代码转换为c代码,再将C代码封装成DLL,所以com的内函数的定义是c形式的): virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE myadd(
/* [in] */ long nargout, ;输出参数的个数
/* [out][in] */ VARIANT *y, ;输出参数
/* [in] */ VARIANT a, ; 输入参数
/* [in] */ VARIANT b, ; 输入参数
/* [in] */ VARIANT c) = 0; ; 输入参数
我用以下AU3代码调用此COM的内置函数myadd:$WaveAudio=ObjCreate("baoadd.Class.1_0")
$Wa=DllStructCreate("Variant Wa[256]")
$pWa=DllStructGetPtr($Wa)
$Waa=$WaveAudio.myadd(1,$pWa,6,7,"c:\trane")
MsgBox(0,"",$Wa)
MsgBox(0,"",$Waa)
结果是可以成功调用com的内置函数myadd,但是始终无法获取该函数的返回值y,显示为0;在此求教高手该如何修改,十分感谢!
下面这个链接是其它语言调用此类COM的案例,敬请参考:
http://ljf9310.blog.163.com/blog/static/6353400201061434235136/
附件是已经打包的DLL文件,请先将后缀“.au3”改为“.exe”。然后直接双击“baoadd_pkg.exe”即可完成注册,注册表内建立类名为“baoadd.Class.1_0”对象。欢迎测试!
谢谢user3000 大侠的提醒,附件中还缺少名为“MCRInstaller.exe”的MATLAB环境部署文件,测试无法进行。在这里恳请高手们给一些代码修改的建议,对于您的建议我将逐个测试!谢谢! |