曾經有一位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
萬連文 閱讀(2219)
評論(4) 編輯 收藏 引用 所屬分類:
ATL