为在用COM做程序的DELPHI程序员提个醒 -- FROM FOXNT
foxnt 2003-07-30 04:13:28 我看到很多初学者(可能是受了某人的书的影响),在用COM写程序的时候,在传递一些TYPELIB编辑器未定义的类型作为参数时,总是喜欢使用VARIANT来作为参数。这个虽然没什么错误,但是是个不好的习惯。
VARIANT这种类型本身占用内存大,速度慢。而且只支持标准类型,很难支持自定义的参数类型。所以大家如果有自定义的参数类型要传递给COM方法时,建议大家使用如下方式:
1)使用自定义的interface,该interface当然是从Iunknown或者IDispatch继承下来的。为他们定义自己的属性,然后作为参数传递,就可以达到目的。例如:
HRESULT _stdcall SendPacket([in] IPacket * pPacket);
该例子用一个自定义的IPacket接口作为参数来传递。
IPacket = interface(IUnknown)
['{678F2D1B-5D36-4AB8-AB35-DA09788D3150}']
function Clear: HResult; stdcall;
function Get_Length(out pVal: Integer): HResult; stdcall;
end;
特别的。以前在DELPHI里有个经典的问题,很多人都问,怎么在COM里传出一个ado的Recordset出来。当时很多人都发现无法使用VARIANT来传这个东西。但是其实很简单,用一个IUnknown类型就可以传出来了。因为Recordset就是一个接口类型。:)
2)如果你不想使用接口,想使用完全自定义的类型,比如你自己定义的一个指针对象。可以使用void*这种方式(注意这种方式不能在DCOM里使用)
HRESULT _stdcall AddData([in] void * pDataAddRess, [in] long Len );
delphi把void*解析成pointer这种无类型指针。注意,大家可以查看下编辑器生成的IDL代码,其实DELPHI是省略了[local]表示符。MS定义的标准方式其实应该是:
[local][helpstring("method GetData")] HRESULT GetData([out,retval] void* pDataAddRess);
前面有个[local]符号,表示这是本地调用。
希望对大家有用。赶快抛弃没用的VARIANT吧。