0
A
回答
1
當對象在同一個房間內加載進程(即從一個DLL)時,可能會有一些技巧可以在內存中找到DLL。例如,如果您查看虛擬方法表(vtable)中的代碼指針進入活動對象,它們通常會指向DLL。然後,您可以使用一些系統調用來確定代碼是哪個加載的DLL。
但是有很多潛在的缺陷。如果您必須將這些對象加載到單獨的單元中,那麼代碼指針將指向一個存根,而不是實際的代碼。另外,許多COM庫實際上都在運行時提供的包裝類中實現公共接口,因此很可能會在許多常見用例中給出錯誤信息。 (也就是說,你最終會得到運行時DLL的信息,通常是MFC或ATL)。
當一個對象被加載出過程(即從一個EXE)時,我不知道任何可行的方法來追查哪個EXE對應於活動對象。 (很明顯,這些數據必須存在於你的進程或COM運行時的某個地方,但它被埋在存根之下的某個地方,並且可能取決於你正在運行的Windows的版本)。
所以,除非您正在查看一組非常有限的對象(與您在同一間公寓內加載的所有進程中),否則最好的辦法是使用註冊表中的註冊信息查找您需要的內容。這很麻煩,因爲這是可能從操作系統的版本到版本之間發生變化的事情之一,但幸運的是COM已經存在了很長時間,以至於這些年來這一切都沒有改變。
給你從Component Categories Manager得到了一個對象的CLSID,你會查找對應的二進制文件,如下所示:
- 打開註冊表項
HKEY_CLASSES_ROOT\CLSID\{xxxxxxxxx-yyyyy-zzzz-aaaa-bbbbbbbbbbbbbb
}其中括號內字符串的的CLSID你想找到的對象。 - 如果這是一個進程內對象,將會有一個名爲InProcServer32的子項,其「default」
REG_SZ
包含您需要的DLL的完整路徑。 - 如果這是一個超出proc的對象,將會有一個名爲LocalServer32的子項,其「default」
REG_SZ
包含您需要的EXE的完整路徑。在某些情況下,您可能不得不修剪掉這個字符串的命令行開關以獲得EXE路徑。 - 使用以前步驟中的DLL或EXE,可以在Win32中調用GetFileVersionInfo()(如果有.NET,則使用System.Diagnostics.FileVersionInfo.GetVersionInfo)以從可執行文件中檢索版本信息結構,該版本信息結構中將包含版本和說明。
0
假設它只用於記錄目的,獲取此信息的一種方法是簡單地等待所有初始化完成,然後枚舉加載的模塊,並將每個日誌文件的詳細信息轉儲到日誌文件。
顯然,這隻適用於inproc對象,如果應用程序非常動態,它將不起作用,但它也會捕獲非COM DLL。
相關問題
- 1. 從.Net訪問C++ com對象(版本信息)
- 2. SharePoint客戶端對象模型(COM)文件版本信息
- 3. Console.log顯示隱藏的對象信息
- 4. COM對象和不同版本的DLL
- 5. 獲取COM對象的版本
- 6. com對象c#的跟蹤版本。
- 7. Python - 顯示COM對象
- 8. 本地「路徑」存儲庫沒有看到vcs版本信息
- 9. 如何顯示數組對象信息?
- 10. 重新加載html以顯示信息
- 11. 類路徑衝突:org.clojure/clojure版本1.7.0已經加載,NOT加載版本1.8.0
- 12. 如何使用顯示XmlFormView組件信息的路徑*內VisualWebPart
- 13. 我可以在Eclipse中顯示Ant Buildfiles的路徑信息嗎?
- 14. 汞柱的輸入的顯示版本庫的根路徑
- 15. 的AssemblyInfo版本信息,星號表示
- 16. 版本控制Windows COM對象
- 17. CacheDependency:需要絕對路徑信息
- 18. Yii2顯示基本路徑
- 19. mod_rewrite'添加路徑信息後綴:'
- 20. SSRS顯示基本信息
- 21. Google地球的iOS版本中未顯示Placemark kml信息
- 22. Slim Framework使用舊的api版本顯示信息
- 23. 在Windows應用程序中顯示UI中的版本信息
- 24. Swashbuckle UI顯示不同版本的相同信息
- 25. 在Django中設置媒體路徑來對象DateField信息
- 26. 顯示加載信息,而內容加載
- 27. 顯示的信息
- 28. 保存\加載圖像信息(路徑,resourceId)到設備
- 29. COM加載項沒有顯示在Excel 2003的Com加載項窗口中
- 30. 如何添加對許多不同版本的Outlook COM對象的引用?