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参数。
高手帮忙啊。
引入的类及接口:
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参数。
高手帮忙啊。
...全文
相关推荐
delphi com对象 php 调用
delphi com对象的制作 com 对象PHP调用
delphi中提示尚未调用coinitialize错误的解决方法.docx
。。。
delphi调用Java webservice实例
NULL 博文链接:https://longwenbin2008.iteye.com/blog/299543
delphi调用GOOGLE API
delphi调用GOOGLE API,引用GOOGLE API查看地图!
DELPHI调用有道 API 翻译(xml方式)
DELPHI调用有道 API 翻译 1、输入申请的API信息 2、输入要翻译的内容 3、获取结果 需要用到Indy控件和XML解析技术。


Windows SDK/API
