曾经有一位csdn朋友问过我这个问题(当时自己很自大,以为知道很多),由于孤陋寡闻没能够帮助解决,并且告诉他不可能实现。现在等我知道怎么实现了,确不知道那个朋友在那里。如果上天再给我一次机会,我宁愿不回答。如果非要我给一个答案,我想该说不知道。
无知无畏,大放厥词,不知道有没有误导别人,为自己行为感到惭愧,愿那个朋友已经找到解决方法。在此给出实现,希望对后面有需要的人有帮助。
我开始了解类型库应该说是从.NET开始,它里面有程序集的概念,程序集里面有类型,可以通过反射技术动态创建。当我再回头看COM的类型库时,我完全明白了。在这一点.NET从思想上和COM的类型库(or OLE)完全等同。COM类型库等同于程序集的概念,它里面也是类型,下面摘自SDK:
typedef /**//* [v1_enum] */
enum tagTYPEKIND
{ TKIND_ENUM = 0,
TKIND_RECORD = TKIND_ENUM + 1,
TKIND_MODULE = TKIND_RECORD + 1,
TKIND_INTERFACE = TKIND_MODULE + 1,
TKIND_DISPATCH = TKIND_INTERFACE + 1,
TKIND_COCLASS = TKIND_DISPATCH + 1,
TKIND_ALIAS = TKIND_COCLASS + 1,
TKIND_UNION = TKIND_ALIAS + 1,
TKIND_MAX = TKIND_UNION + 1
} TYPEKIND;
通过dll查看类型库有很多种办法,借助VB开发环境,使用OLE View(VC6自带小工具)附上一张图:
为什么要用编程方式获取类型库信息呢?自然有理由,想想VB IDE导入类型库如何实现的?下面就介绍编程。
// load a dll contain typelib
hr = LoadTypeLib(L"TgmDocument0906.dll", &pITypeLib);
if(SUCCEEDED(hr))
{
// get account of types and iterate
nType = pITypeLib->GetTypeInfoCount();
for(nIt=0; nIt<nType; ++nIt)
{
// get each type
hr = pITypeLib->GetTypeInfo(nIt, &pITypeInfo);
if(SUCCEEDED(hr))
{
// what the type is? see define of TYPEKIND, it is a enum
pITypeLib->GetTypeInfoType(nIt, &enumKind);
// get type name
pITypeInfo->GetDocumentation(MEMBERID_NIL, &bstrName, NULL, NULL, NULL);
// print type and name
PrintType(enumKind, W2A(bstrName));
// if dispatch, we print all the functions(or property but i didn't distinguish)
if(enumKind == TKIND_DISPATCH)
{
PrintDispFunc(pITypeInfo);
}
SysFreeString(bstrName);
pITypeInfo->Release();
pITypeInfo = NULL;
}
}
pITypeLib->Release();
pITypeLib = NULL;
} 我加载一个以前写的com dll(当然理论上可以是任何含有类型信息的dll或者exe),然后遍历所有类型,获取类型的名字并打印,如果类型是dispatch接口,打印出所有接口函数(可能是属性,在此我没有判断)。下面是实验结果:
示例代码下载
posted on 2006-09-06 22:21
万连文 阅读(2197)
评论(4) 编辑 收藏 引用 所属分类:
ATL