Delphi 到底应该如何调用COM?

kim_fu 2011-01-25 09:36:12
有一个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参数。

高手帮忙啊。
...全文
520 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kye_jufei 2011-02-07
  • 打赏
  • 举报
回复
直接CreateOleObject不行嗎。。。
wdljn 2011-01-30
  • 打赏
  • 举报
回复
用CreateOleObject方法,不用导入什么东西
szuzsq 2011-01-26
  • 打赏
  • 举报
回复
COM不是一般ComCreateInstance()?
CaiBirdy 2011-01-26
  • 打赏
  • 举报
回复
COM就是CoInitialize,结束最好要调用CoUninitialize,都在ActiveX里
OLE的是OleInitialize
CaiBirdy 2011-01-26
  • 打赏
  • 举报
回复
可能是你没有初始化COM,就是那个什么什么init啥的记不清

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧