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