2017-08-26 118 views
0

我需要編寫一個程序,使用一些COM對象,從python comtypes包中進行訪問。我使用clsid和/或progid來創建和使用它們。這些對象由第三方提供,通常安裝有普通安裝程序(setup.exe或msi文件)。假設這些dll文件有一個許可證,允許我將它們與我的程序一起發貨。是否有可能將這些DLL文件加載到內存中,並從便攜式應用程序使用它們,而無需實際註冊它們?或者,我可以從我的程序註冊嗎?如何將COM dll打包到便攜式應用程序中?

一個相關的問題是:如何確定創建給定COM對象所需的dll文件鏈? (除了試驗和錯誤)

背景:實際上,有多個庫,主要問題是我不希望用戶在啓動實際程序之前運行4個不同的安裝程序。這對普通用戶來說太困難了。

回答

2

你在這裏問很多問題。有很多方法可以完成你想要完成的任務,並且很難回答如此廣泛的問題。如果您對如何執行特定的事情有特定的問題,請爲這些人開啓新帖。

這就是說,我會盡力給你一些信息來幫助你弄清楚你需要做什麼。

你可以在不註冊它的情況下使用COM DLL嗎?

是的。有幾種方法,這取決於您使用的COM DLL和平臺的需求。但是,有些選項並不總是有效,其他選項非常具有挑戰性。

  • DllGetClassObject - 在某些情況下,這取決於你試圖加載COM對象,你可以加載DLL,直接調用DllGetClassObject功能,並使用返回IClassFactory來創建對象。這是最簡單的方法 - 如果有效的話。如果您創建的類需要DLL註冊(可能它在內部執行CoCreateInstance,或者它可能需要代理支持),但這對您無效。要確定這是否可行,它可能是反覆試驗,或者你必須向COM DLL的開發者詢問。
  • Registration-free COM - 這是如何在.NET中完成的。我不確定您是否可以在Python中輕鬆完成這樣的任務。
  • CoRegisterClassObject - 如果您要創建自己的免註冊COM實現,該功能將非常關鍵。我相信這是Microsoft免註冊COM的基本實現細節。不過要注意的是,這將是一件非常有挑戰性的事情,而且這將需要很好的理解COM。

你能從你的程序註冊一個COM DLL嗎?

是的。有幾種方法。但是,您可能會遇到安全問題 - 通常,COM組件在HKEY_LOCAL_MACHINE中註冊,並且您通常需要管理員權限才能在此處編寫代碼。某些COM組件/安裝程序旨在在HKEY_CURRENT_USER中註冊自己,這將解決安全問題。但是,您可能無法控制組件註冊的位置,即使您註冊了HKEY_CURRENT_USER也不是完美的解決方案。

  • regsvr32.exe - 一種選擇是以編程方式在DLL上調用regsvr32.exe
  • DllRegisterServerDllInstall - 如果一個COM DLL可以註冊到regsvr32.exe,那麼它至少有一個這樣的函數被導出。您可以手動加載DLL並調用這些函數,就像regsvr32.exe一樣。 DllInstall不如DllRegisterServer。如果有DllInstall,它可能會讓您選擇安裝在HKEY_CURRENT_USER。如果不是,你只需要做任何事情,因爲沒有你可以提供給該功能的選項。
  • 自己編寫註冊表值 - 如果能夠找出所需的所有註冊表設置,則不會阻止您將其手動放入註冊表中。這將得到HKEY_LOCAL_MACHINE/HKEY_CURRENT_USER問題 - 您可以將它們寫入任何地方(但HKEY_LOCAL_MACHINE仍可能需要管理員權限)。
  • regedit.exe - 另一種自己編寫註冊表值的方法是將它們存儲在.reg文件中,並致電regedit.exe將它們合併。

如何確定DLL的依賴關係?

理想情況下,該DLL的開發人員知道並可以告訴你。這是真正的傻瓜證明的唯一方法。

  • 對於COM依賴關係,除了要求開發人員或反覆試驗之外,可能無法找出其他任何方式。這是因爲COM依賴可能存在,只是因爲DLL中的一些代碼只是調用CoCreateInstance來創建一些第三方COM對象,並且由於這是僅在源代碼中表達的內容,所以在DLL上沒有任何元數據可以幫助你會發現這些依賴關係。
  • 以上對於任何動態加載的依賴關係也是如此。例如,如果某些代碼直接調用LoadLibrary,則無法從外部確定依賴關係。
  • 對於靜態加載的依賴關係,可以使用像Dependency Walker這樣的工具。請注意,您將看到的很多依賴關係是系統依賴關係 - 您不希望包含user32.dll和kernel32.dll,因爲它們隨Windows一起安裝。

如何安裝第三方依賴項?

如果您確切地知道要寫入什麼文件,在哪裏寫入以及需要應用哪些註冊表設置(等),您可以自己完成所有這些。對於某些依賴關係,只需在安裝程序中包含第三方安裝程序並將其靜默執行即可。正因爲如此,許多安裝人員都支持靜音模式。一個很好的例子就是Visual C++運行時(msvcrt * .dll) - 許多應用程序需要這種依賴性,許多安裝程序只是將Microsoft的安裝程序作爲發行版的一部分,而主安裝程序只是靜靜地調用輔助安裝程序。