在COM的类型库中,如何传递Delphi自己的数据类型的参数。(200分)

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

hxg

Unregistered / Unconfirmed
GUEST, unregistred user!
在建立COM服务器时,添加某接口的方法时,我发现只能传递微软的
那一套参数,而无法传递Delphi自己的数据类型作为参数,如传递
TColor、或TQuery的数据类型的参数。请教高手,有无解决办法。
 
不是可以封装在变体(ole)Variant里面吗?
 
怎么装呀?
 
这个就复杂了
好象要自己实现marshing之类的东西
 
先将数据转换成流。然后用TDataPacket和DataPacketToVariant压缩成Variant。传递后
还原,这样可传递任何东东。有转换代码可Mail我。
 
hzbl:
就劳驾给我寄一份吧。谢谢。
xianguoh@163.net
 
easy,用类型库编辑器来new record,
比如
创建下面这样的record
tdemo=record
i:integer;
d:double;
end;

然后,新建对象方法,这时你就会在参数列表中发现Tdemo了,delphi利用类型库的信息
会自动marshal新的类型参数的
 
试试:
装入Variant:
MyQuery:TQuery;
V:Variant;
P:Pointer;

V:=VarArrayCreate([0,Sizeof(TQuery)],varByte);
P:=VarArrayLock(V);
Move(MyQuery,P^,Sizeof(TQuery));
VarArrayUnLock(V);

取出 V:variant:
var P:Pointer;
MyQuery:TQuery;
begin
P:=VarArrayLock(V);
Move(P^,MyQuery,Sizeof(TQuery));
VarArrayUnLock(V);

对了就发分结束。
 
我想如果是类的话,则可以采用上面那位老兄提供的缓存到Variant变量中的方法来实现.
如果是结构的话,则可以采用将其转换为Delphi COM支持类型的方法来实现.比如说要传递
tmyclass结构的变量i则可以先将i转换为整型然后再传统即integer(i)
 
看来,用Com仍有一定的限制。
 
后退
顶部