2014-07-15 71 views
0

如何以編程方式確定給定的本機VB6生成的DLL/OCX所依賴的類型庫(GUID和版本)?從類型庫獲取importlib指令

對於背景:當打開一個引用的類型庫無法加載其依賴項之一的項目時,VB6 IDE扼流圈窒息,但它沒有那麼有用,無法說明哪個依賴項無法滿足 - 甚至該引用具有無法滿足的依賴性。這是我公司常見的情況,所以我試圖補充VB6 IDE糟糕的故障排除信息。

相關細節/嘗試:

  • 有VB源代碼。這告訴我在回購中特定版本的GUID和版本,但是在分析DLL/OCX/TLB文件時,我不知道回購的哪個版本(如果有的話 - 可能來自分支或者可能永遠不會已被分配給一個分支)給定的DLL/OCX對應於。
  • 我試過使用tlbinf32.dll,但它似乎不能列出導入。
  • 我對PE沒有太多瞭解,但是我在PE查看器中彈出了其中一個DLL,它只在導入部分顯示MSVBVM60.dll。這似乎是VB6生成的類型庫的一個特別的怪癖:它們僅鏈接到MSVBVM60,但對於其他依賴關係具有某種延遲加載機制。
  • 即使我嘗試過的大多數現有工具都不提供這些信息 - 例如,depends.exe只能找到MSVBVM60.dll
  • 但是:OLEView,用於在Visual Studio中提供的實用程序,以某種方式生成IDL文件,其中包含importlib指令。鑑於VB不使用IDL文件,它顯然會以某種方式生成信息。所以這是可能的 - 我只是不知道如何。

真的,如果OLEView沒有做到這一點,我會放棄它現在是不可能的。有關如何完成此任何想法?

回答

0

事實證明,我是基本的DLL功能和COM混合。 (並非所有的DLL都是COM DLL)

對於基本的DLL,Portable Executable格式包含一個描述其導入的部分。可選標題的目錄1是關於DLL的導入。其結構由IMAGE_IMPORT_DESCRIPTOR給出。 This是瞭解這一點的起點。

COM DLLs似乎並沒有像這樣的等價物,但你可以發現它的公共接口需要的其他COM組件:對於每個公開接口,列出它們的屬性類型和它們的方法參數,然後使用註冊局查詢這些類型的來源。 tlbinf32.dll提供了列出成員的一些基本功能,例如Here和介紹。