曾經(jīng)有一位csdn朋友問過我這個(gè)問題(當(dāng)時(shí)自己很自大,以為知道很多),由于孤陋寡聞沒能夠幫助解決,并且告訴他不可能實(shí)現(xiàn)。現(xiàn)在等我知道怎么實(shí)現(xiàn)了,確不知道那個(gè)朋友在那里。如果上天再給我一次機(jī)會(huì),我寧愿不回答。如果非要我給一個(gè)答案,我想該說不知道。
無知無畏,大放厥詞,不知道有沒有誤導(dǎo)別人,為自己行為感到慚愧,愿那個(gè)朋友已經(jīng)找到解決方法。在此給出實(shí)現(xiàn),希望對(duì)后面有需要的人有幫助。
我開始了解類型庫(kù)應(yīng)該說是從.NET開始,它里面有程序集的概念,程序集里面有類型,可以通過反射技術(shù)動(dòng)態(tài)創(chuàng)建。當(dāng)我再回頭看COM的類型庫(kù)時(shí),我完全明白了。在這一點(diǎn).NET從思想上和COM的類型庫(kù)(or OLE)完全等同。COM類型庫(kù)等同于程序集的概念,它里面也是類型,下面摘自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查看類型庫(kù)有很多種辦法,借助VB開發(fā)環(huán)境,使用OLE View(VC6自帶小工具)附上一張圖:

為什么要用編程方式獲取類型庫(kù)信息呢?自然有理由,想想VB IDE導(dǎo)入類型庫(kù)如何實(shí)現(xiàn)的?下面就介紹編程。
//?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;
????}我加載一個(gè)以前寫的com dll(當(dāng)然理論上可以是任何含有類型信息的dll或者exe),然后遍歷所有類型,獲取類型的名字并打印,如果類型是dispatch接口,打印出所有接口函數(shù)(可能是屬性,在此我沒有判斷)。下面是實(shí)驗(yàn)結(jié)果:

示例代碼下載
posted on 2006-09-06 22:21
萬連文 閱讀(2220)
評(píng)論(4) 編輯 收藏 引用 所屬分類:
ATL