ActiveX安装不成功,直接创建其对象报错,采用接口机制进行判断.

 最近做的系统里用到了个ActiveX,它是个虚拟摄相头ax文件。安装了它驱动后,反复卸载安装后发现一个问题。
因为Delphi程序里导入安装了这个对像并生成一个控件,我采用直接创建对象的方式来访问。
而最开始,程序采用dspack枚举视频设备的列表方式判断它是否安装。结果(反复)卸载后,发现不重启电脑,dspack枚举视频设备的列表方式发现它还在,而创建这个对象就会报错: 没有注册类别。用try Except捕捉拦截不了这个错误,总是会在程序中报错误框,很不友好,导致了不可控。
  另外,发现安装的这个控件的类并不是从接口直接继承的,那个接口是作为这个类的一个私有成员变量出现的。
  这样一般的判断对象是否支持接口的方式,就不太好用了(自己水平有限)。
  看了一个ComObj单元的CreateComObject函数的代码:
  1. function CreateComObject(const ClassID: TGUID): IUnknown;
  2. begin
  3.   OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
  4.     CLSCTX_LOCAL_SERVER, IUnknown, Result));
  5. end;

发现它调用了OleCheck,好像这个错误拦截不了了。于是我采用如下办法来判断这个对象是否成功注册
  1.     //判断接口是否注册
  2.     try
  3.       CoCreateInstance(CLASS_VCamSDK, nil, CLSCTX_INPROC_SERVER or
  4.       CLSCTX_LOCAL_SERVER, IUnknown, iRoot);
  5.       if iRoot = nil then Exit;
  6.       iRoot.QueryInterface(IID_IVCamSDK, Ainf);
  7.       if Ainf = nil then Exit;
  8.     except
  9.       iRoot := nil;
  10.       Ainf := nil;
  11.       Exit;
  12.     end;
如果这里接口返回nil则直接函数退出。不再执行下面的对象创建。OK了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值