2008-12-05 30 views

回答

12

您可能還想嘗試爲您的項目設置Reg-Free COM。有一個名爲Make My Manifest的免費軟件可以幫你做大部分工作

編輯 MMM網站已關閉。我看到here,作者與他們的託管有問題,並提供了另一個位置讓我的清單 - download it here

5

發現它自己:

Windows不會看在app目錄第一: 如果啓用SafeDllSearchMode,搜索順序如下:

  1. 從其中加載應用程序的目錄。
  2. 系統目錄。使用GetSystemDirectory函數獲取此目錄的路徑。
  3. 16位系統目錄。沒有獲得該目錄路徑的函數,但它被搜索。
  4. Windows目錄。使用GetWindowsDirectory函數獲取此目錄的路徑。
  5. 當前目錄。
  6. PATH環境變量中列出的目錄。請注意,這不包括App Paths註冊表項指定的每個應用程序路徑。計算DLL搜索路徑時不使用App Paths鍵。

如果SafeDllSearchMode被禁用,檢索順序如下:

1.從其中加載應用程序的目錄。 2.當前目錄。 3.系統目錄。使用GetSystemDirectory函數獲取此目錄的路徑。 4. 16位系統目錄。沒有獲得該目錄路徑的函數,但它被搜索。 5. Windows目錄。使用GetWindowsDirectory函數獲取此目錄的路徑。 6. PATH環境變量中列出的目錄。請注意,這不包括App Paths註冊表項指定的每個應用程序路徑。計算DLL搜索路徑時不使用App Paths鍵。

根據

http://msdn.microsoft.com/en-us/library/ms682586.aspx

但是你可以重定向它查找.dll文件使用清單的:

http://msdn.microsoft.com/en-us/library/aa375365(VS.85).aspx

5

它可以是有點令人困惑,因爲每個版本的Windows,規則更改。較舊版本的Windows在當前目錄之前搜索路徑。

沒有體現一個簡單的辦法:

如果你的可執行文件是A.EXE,在名爲A.EXE.local同一目錄中添加一個(0字節,空)文件 - 舊版本的Windows,這把app目錄提前搜索順序中的路徑。

+1

這是Win2k +上的正確答案。 但是,請注意,如果A.EXE具有嵌入式清單,或者存在A.EXE.manifest(例如啓用免註冊COM,使您的程序識別DPI等),則忽略.local文件因爲體現是爲了替代技術。 如果是這種情況,在清單中,您可以簡單地列出要從您的應用程序目錄中使用的文件,以強制它們從那裏加載: 2009-04-19 09:26:09

6

Clay Nichol對搜索順序的回答並不完全正確。該搜索順序僅適用於非COM組件。即只有一些DLL,而不是OCX。如果你註冊你的COM對象,它們將從它們註冊的目錄中被使用,而不管本地目錄中是什麼,,除非你使用無reg或者.local文件的

編輯:

MakeMyManifest很好口語的,因爲用於創建VB6的項目清單自動工具,還沒有嘗試過自己。 DirectCOM也有粉絲,再次我沒有嘗試過。

編輯 MMM網站已關閉。我看到here,作者與他們的託管有問題,並提供了另一個位置讓我的清單 - download it here

有一種半自動技術來生成無reg的COM表單。您可以使用Visual Studio 2008創建清單(可以使用免費版本,如Visual Basic Express Edition)。然後手動進行一些編輯,使清單適合在VB6中使用。有關分步說明,請參閱本MSDN文章的this section - 忽略有關ClickOnce的文章的其餘部分。

6

將組件庫放置在EXE文件夾(帶或不帶.local文件)中也可能對目標機器的衛生有害。

如果VB6程序以前沒有註冊過,它們將通過背後的自注冊入口點在這裏註冊組件。然後,如果應用程序被移動或刪除,則會導致用戶的重新註冊失敗 - 對於隨後使用某些相同組件進行安裝的應用程序可能是致命的。對於特定於應用程序的組件,這可能是很好的,也就是說,您自己的DLL或OCX將會被其他應用程序需要的永不

.local技巧並不適用於VB6程序,如果使用它,安裝程序需要注意並正確安裝並註冊組件,如果它們尚未安裝在機器上。這是爲了解決單個機器上的DLL版本兼容性問題而不是部署策略的手動攻擊。

上移到SxS應用程序和程序集清單(免註冊COM和更多)以獲得更好的解決方案。 DLL/COM重定向(.local)是一個很好的嘗試,但它有許多疣。

相關問題