描述:
知道一个COM借口ITest,如何知道它的clsid和iid
3x
解决方案1:
CLSID
__uuidof(Test)
IID
__uuidof(ITest)
到hkey_classes_root/interface下面搜索,Itest,可能找到多个,即iid了。iid键的子健里能找到clsid。
解决方案3: 实例化时必须知道CLSID和IID,这一般应由开发组件的人写的帮助文档获得,或者开发者顺便加了一个导出函数以方便创建实例。比如说DirectX就是一堆DLL,里面包含了多个COM组件,因此它也提供了DirectX的SDK文档,并也提供了诸如CreateDirect3D8之类的API以简化和帮助用户创建那种支持IDirect3D8接口的组件,这里用户就不需要知道IDirect3D8的IID和组件的CLSID。
而平时我们用的ActiveX控件绝大部分都没有提供文档,但它们都带有类型库(一般融合进DLL中),可以用OleView进行查看类型信息,里面记录了这个ActiveX控件的CLSID、支持的接口的IID及接口布局,以及许多其他信息。对于使用这种ActiveX控件,由于没有文档,只有查看类型信息,根据接口的成员函数的名字和参数大致猜测它们的用法,而且ActiveX一般都是双接口,也就是实现了IDispatch,则使用时根据CLSID创建的实例接口(IDispatch*),再根据类型库查得欲调用函数的DISPID,通过IDispatch::Invoke调用,这样就不需要知道特定的IID。不过更一般的是通过智能环境(如VC)根据类型库生成包装类,简单地调用包装类的成员函数即可。
OLEVIEW可以看到
CLSIDFromProgID中的programID可以用Lib和
接口名字拼成
OLEVIEW都可看到
CLSID clsid;
if(FAILED(::CLSIDFromProgID(L"Word.Document.8",&clsid)))
AfxThrowMemoryException();
您可能想查找下面的文章:
- CoCreateInstance和CoCreateInstanceEx的区别??
- 抓狂!看了几天了,CoCreateInstance总是出错!!!!救命啊!
- 请教CoCreateInstanceEx产生E_ACCESSDENIED的原因
- CoCreateInstance的内部实现问题??
- 在DEV-CPP中编译建立快捷方式代码出现incompatibletypeforargument1of`CoCreateInstance'
- 用dll的COM除了cocreateinstance能不能就当普通DLL用loadlibrary调用。
- CoCreateInstanceEx问题
- CoCreateInstance调用成功,CoGetClassObject调用失败,为什么?
- CoCreateInstance调用出错,帮看看!
- CoCreateInstance的问题