版主别删 Delphi 调用COM 传递OleVariant参数,提示类型不匹配!!

kim_fu 2011-02-11 10:32:49
用Delphi 调用一个COM组件,引入类型库后,调用其中一个GetBuffer方法,该方法存在一个OleVariant参数,运行时总提示类型不匹配。
代码:
var
Cim:Variant;
V:Variant;
begin
Cim := CreateOleObject('CimioX.Cimio');
V:= VarArrayCreate([0,100],varByte);
Cim.GetBuffer(V,100);//此处编译通过,运行提示“类型不匹配”
end;

导入的类型库的定义如下:
// *********************************************************************//
// DispIntf: _CimioDisp
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {97E11287-9BB3-11D3-9116-00C04FA15BDB}
// *********************************************************************//
_CimioDisp = dispinterface
['{97E11287-9BB3-11D3-9116-00C04FA15BDB}']
property EnableErrEvents: WordBool dispid 1745027095;
property PassThruMode: WordBool dispid 1745027094;
property ErrDescription: WideString readonly dispid 1745027092;
property CimType: ePassThru readonly dispid 1745027091;
procedure SendAWrd(WordOut: Smallint; usDelay: Integer); dispid 1610809388;
function SendWrd(WordOut: Smallint; var WordIn: Smallint; Attempts: Byte): WordBool; dispid 1610809369;
function ClearFIFO: WordBool; dispid 1610809370;
function StartReceiveBuffer(WordOut: Smallint; GenEvent: WordBool; TimeOut: Smallint): WordBool; dispid 1610809371;
function GetBuffer(var Buffer: {??PSafeArray}OleVariant; TimeOut: Smallint): Integer; dispid 1610809374;
function SendBuffer(var Buffer: {??PSafeArray}OleVariant; usDelay: Integer): WordBool; dispid 1610809375;
...全文
278 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicklisir 2011-02-21
  • 打赏
  • 举报
回复
不满意结贴吧,好像有分回
kim_fu 2011-02-21
  • 打赏
  • 举报
回复
没解决啊?

现在很困惑, 问的问题都没解决,不结贴的话,影响自己的结帖率, 不满意结贴的话还不返还分数。

我滴个神啊! 我该怎么办?

那位神仙姐姐帮帮我啊!
nicklisir 2011-02-20
  • 打赏
  • 举报
回复
楼主解决了没有,解决了就把答案放上来好方便大家学习;
wyx100 2011-02-17
  • 打赏
  • 举报
回复
是类型转换出错了,可以查下关于com的几种数据类型
nicklisir 2011-02-12
  • 打赏
  • 举报
回复
variant是个变体结构,所以要现实标志那个成员有用;
dephi的环境不是很熟悉,你应该可以找到他的定义;
以下资料给你参考:com本质论 第2章 接口 中的IDL语言 p70/86
wyx100 2011-02-11
  • 打赏
  • 举报
回复
是类型转换出错了,可以查下关于com的几种数据类型
&捕风的汉子& 2011-02-11
  • 打赏
  • 举报
回复
是类型转换出错了,可以查下关于com的几种数据类型
手机写程序 2011-02-11
  • 打赏
  • 举报
回复
function GetBuffer(var Buffer: {??PSafeArray}OleVariant; TimeOut: Smallint): Integer; dispid 1610809374;

OleVariant和Variant没有区别吗?100是Smallint吗?
nicklisir 2011-02-11
  • 打赏
  • 举报
回复
查了相关资料:olevariant:variant *
jameshooo 2011-02-11
  • 打赏
  • 举报
回复
虽然不知道DELPHI的类型库格式,但是可以猜测出来,第一个参数要求是VARIANT类型的SAFEARRAY,但你传递的参数类型是BYTE类型的SAFEARRAY
kim_fu 2011-02-11
  • 打赏
  • 举报
回复
to :nicklisir
你给的两个方法我试了。都不行啊。
to:eyey1
我定义一个Smallint的变量,存入100,调用函数还是同样的错误,问题是出在OleVariant这个参数上
nicklisir 2011-02-11
  • 打赏
  • 举报
回复
在dephi中试了下:2中方法:
1.将v定义为olevariant;
2.定义另一参数;var pp:Olevariant;
在调用之前;pp=V;
Cim.GetBuffer(pp,100);

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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