关于COM对word数组的传递的疑问(200分)

  • 主题发起人 主题发起人 hening
  • 开始时间 开始时间
H

hening

Unregistered / Unconfirmed
GUEST, unregistred user!
此com的一个方法是这样声明的
ADpoll_array(WORD buff[],int count);
在VB下如此调用:
Set card1 = CreateObject("KHCard")
.....
m = card1.ADpoll_array(ad_array, 10)
我在delphi中是这么写的:
procedure TForm1.Button1Click(Sender: TObject);
var
test:OleVariant;
i,m:integer;
ad_in:word;
ad_array:array[1..10] of word;
dig_in:Shortint;
begin
test:= CreateOleObject('KHCard');
......
ad_in:=1;
m := test.ADpoll_array(ad_array,10);//读10个数据进ad_array数组
end;


'm := test.ADpoll_array(ad_array,10);//读10个数据进ad_array数组'行
报错:[Error] rtptest.pas(52): Type not allowed in OLE Automation call
请问诸位大虾 诸如word buff[]的类型在delphi中是如何传递的?
 
关注
也去查查
 
没人能回答码?
其实就是问WORD buff[]在delphi中相当于什么
再加100 请大虾拔刀.急!
 
怎么又出来一个?

就是var buff: PWORD;
 
var ad_array: PWORD;
begin
GetMem(ad_array,20);
......
m := test.ADpoll_array(ad_array,10);
end;

试试看。
 
to 0*0:
谢谢!
只是还是不行! :(
连编译都通不过;报错在此行:
var ad_array: PWORD;

GetMem(ad_array,20);

m := test.ADpoll_array(ad_array,10);
[Error] rtptest.pas(53): Type not allowed in OLE Automation call

好像COM不能用PWORD型
 
Com可以用指针。
给这个COM接口一个PASCAL的声明。
试试Component/Import ActiveX/Create Units,
生成一个xxx_TLB.pas后再uses xxx_TLB.pas;
或直接翻译:
IThisCom = interface(IDispatch)
['{该接口的CLSID}']
.....
procedure ADpoll_array(var buff:PWORD;count:Integer);
.....
end;
 
to o*o:
能否说的再详细些,我的这个active x 没有原码怎么也能生成
tlb吗?
CLSID是什么?能否受累把语句注释一下,谢谢!300分都可以给你.
 
没有原码也能生成tlb。没问题。
你先试试生成一下,有了xxx_TLB.pas就知道是怎么声明的了。
CLSID是COM对象的注册ID。
 
to o*o:
我在我的Component/Import ActiveX/为何找不到这个
dll(carda.dll)Add后也不行,真是急死人!
我后来用这个方法不知行不行(编译通过了)
var
test:OleVariant;
i,m:integer;
ad_array:Variant;
begin

ad_array:=vararraycreate([0, 9], varDouble);//此处用varDouble可以代替word型吗?
..
test:= CreateOleObject('KHCard');
...
m := test.ADpoll_array(ad_array,10);
..
end;
 
不清楚为什么生成不了TLB,是否Carda.dll真的注册上了?
varDouble应该改为varInteger吧。
你的方法很好,我没有注意到。
如果这样就能解决,告诉版主一下,分你自己留着吧,因为是你自己解决的。
如果调用后得不到结果,试试下面的:

type
PIntArray = ^TIntArray;
TIntArray = array[0..9] of Integer;
var
ad_array: Variant;
Parray: PIntArray;
begin
ad_array := VarArrayCreate([0, 9], varInteger);
Parray := VarArrayLock(ad_array);
...
m := test.ADpoll_array(Parray,10);
...
VarArrayUnlock(ad_array);

祝你成功!
 
to o*o:
varInteger是不是应该是varsmallint
因为word好像是16位的
而integer是32位的?
我是不是问题太多了,大侠别烦:)
 
WORD是0..65535
而Smallint是-32768..32767,
比如把65000赋给SmallInt,则SmallInt的值就变为负的了.
还是得用varInteger吧。
TIntArray = array[0..9] of Integer;一句似应改为:
TIntArray = array[0..9] of WORD;

BTW:不必客气,我也不太懂COM.
 
刚发现
varBoolean: 16-bit boolean (type WordBool).
就是Word.
 
以后再多聊,先结了题
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
I
回复
0
查看
581
import
I
I
回复
0
查看
881
import
I
后退
顶部