万星星@豌豆荚 欢迎加入我们
一个吃软饭的男人!!!!!我只想写程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0
曾经有一位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 万连文 阅读(1850) 评论(4)  编辑 收藏 引用 所属分类: ATL

FeedBack:
# re: 通过编程获取COM dll中Type和Function
2006-09-07 18:11 | LOGOS
这个页面(不知道是否包括你站点上其他的页面),可以造成我浏览器的内存泄漏,会把整个机器吃了.
我用长风浏览器(IE内核).....  回复  更多评论
  
# re: 通过编程获取COM dll中Type和Function
2006-09-07 22:01 | 漂舟
你浏览器这么歪 ?  回复  更多评论
  
# re: 通过编程获取COM dll中Type和Function
2013-10-30 22:34 | 红色代码
额.顶了星星  回复  更多评论
  
# re: 通过编程获取COM dll中Type和Function[未登录]
2015-08-08 19:29 | 阿牛
PrintDispFunc(pITypeInfo);

PrintType(enumKind, W2A(bstrName));
这两个函数是怎么实现的  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


简历下载
联系我

<2006年2月>
2930311234
567891011
12131415161718
19202122232425
2627281234
567891011

常用链接

留言簿(66)

随笔分类

随笔档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜