Delphi 到底应该如何调用COM?
有一个COM文件 CimioX.dll,我在Delphi7中用 Import Type Library 导入后,在ActiveX面板中生成一个控件TCimio,
引入的类及接口:
CoCimio = class
class function Create: _Cimio;
class function CreateRemote(const MachineName : string): _Cimio;
TCimio = class(TOleServer);
_Cimio = interface(IDispatch);
三种方法调用结果不一样
方法1:使用ActiveX面板上的控件
拖动一个TCimio放到窗体上,执行 Cimio1.OpenCIMIO(); 就提示访问非法内存
方法2:使用接口
Var
Cim:_Cimio;
begin
Cim := CoCimio.Create;
Cim.OPenCIMIO();//出错;
方法3:
Var
Cim:Variant;
begin
Cim := CreateOleObject('CimioX.Cimio');
Cim.OpenCIMIO();//结果正确。
方法一与方法二都是采用 CreateComObject 来创建COM对象
方法三采用 CreateOleObject 来创建COM对象
最关键的是,CimioX.dll中有一个方法是需要传递PSafeArray类型参数的
原型如下:
function GetBuffer(var Buffer:PSafeArray; TimeOut:Smallint):Integer;safecall;
当我用第三种方法CreateOleObject 后,执行
var
v:Variant;
Cim:Variant;
begin
Cim := CreateOleObject('CimioX.Cimio');
v := VarArrayCreate([0,200],varInteger);
Cim.GetBuffer(PSafeArray(TVarData(v).VArray),100);//编译不通过
//编译错误为:"Type not allowed in Variant Dispatch call";
而第一种和第二种方法都可以传递PSafeArray类型参数。
我懵了,不知道该怎么弄了。
我想要的结果:
让第一种或第二种方法执行函数正确,或者第三种方法能传入PSafeArray参数。
高手帮忙啊。