Delphi 到底应该如何调用COM?

kim_fu kim_fu 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
有一个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参数。

高手帮忙啊。
...全文
评论 7
收藏 已收藏
分享
返回顶部
kim_fu
Windows SDK/API 1,184 成员 22,326 内容