如何取得遷移 DLL 的特殊資料夾的位置

文章翻譯 文章翻譯
文章編號: 241733 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

Windows 2000 專業版如果要從 Windows 95 或 Windows 98 升級時, 移轉 DLL 可能想要存取特殊資料夾,例如 [開始] 功能表資料夾或 [桌面] 資料夾。遷移 DLL 不能假設這些資料夾在預設存在的位置。它應該改用 SHGetSpecialFolderPath 或 SHGetFolderPath。

其他相關資訊

SHGetSpecialFolderPath 只能在上執行 Windows 95 如果網際網路總管 4.0 安裝使用桌面的更新程式。在 Windows 2000 SHGetSpecialFolderPath 將永遠會運作。不過,在這兩種情況下最好是使用新 SHGetFolderPath API,是 SHGetSpecialFolderPath 的超集。在 Windows 95 或 Windows 98 上使用 SHGetFolderPath,您必須轉散發 SHFolder.dll 檔和移轉 DLL。

您可以取得 SHFolder.dll 從最新的平台 SDK。若要下載平台 SDK,請參閱下列網站:
http://www.microsoft.com/msdownload/platformsdk/setuplauncher.htm
在安裝平台 SDK 時請務必安裝可轉散發套件的元件及建置環境。而且,選擇與 Microsoft Visual C++ 出現提示時整合平台 SDK。這是必要的因為 SHFolder.h 檔案所需。一旦安裝平台 SDK 完成搜尋可轉散發的可執行 SHFolder.exe 安裝資料夾。這個檔案會安裝 SHFolder.dll 及所有其他所需的 Windows 95 或 Windows 98 上執行的更新。應在使用者的電腦上執行這個可執行檔,當使用者在電腦上放置遷移 DLL。它也可以安裝在您的應用程式安裝過程。

下列程式碼會示範如何取得 SHGetFolderPath API 的指標:
#include <windows.h>
#include <shfolder.h>

PFNSHGETFOLDERPATHA GetFuncPtr_SHGetFolderPathA()
{
   static HMODULE hMod = NULL;
   PFNSHGETFOLDERPATHA pSHGetFolderPath = NULL;

   // Load SHFolder.dll only once
   if (!hMod)
      hMod = LoadLibrary("SHFolder.dll");

   if (hMod)
      // Obtain a pointer to the SHGetFolderPathA function
      pSHGetFolderPath = (PFNSHGETFOLDERPATHA)GetProcAddress(hMod, 
         "SHGetFolderPathA");

   return pSHGetFolderPath;
}
				

下列範例程式碼會示範這個函式的其中一種可能用法。在 Windows 2000 升級的過程的應用程式可能包含 Windows 2000 的特定程式或需要在應用程式的 開始 功能表程式集資料夾的捷徑的公用程式。複製到電腦的新程式後, 移轉 DLL 可以將捷徑新增到使用者的 [開始] 功能表。對於每個使用者設定 MigrateUserNT 函式會是最佳的地方執行這項工作。

下列函式會採用三個參數。 第一個參數是至可執行的目標路徑。 第二個參數則是描述。 最後一個參數是就會在 [開始] 功能表的程式資料夾中建立的子資料夾。 這是將要建立捷徑。
#include <windows.h>
#include <objbase.h>
#include <shlobj.h>
#include <shfolder.h>

HRESULT CreateUserStartMenuShortcut(LPSTR pszShortcutFile,
            LPSTR pszDescription, LPTSTR pszRelativeFolder)
{
   HRESULT hr;
   PFNSHGETFOLDERPATHA pSHGetFolderPath = NULL;
   TCHAR pszLink[MAX_PATH];
   BOOL bFound = FALSE;

   pSHGetFolderPath = GetFuncPtr_SHGetFolderPathA();

   // Find the current user's Start Menu Programs folder
   if (pSHGetFolderPath)
      bFound = SUCCEEDED(pSHGetFolderPath(NULL, CSIDL_PROGRAMS, 
                           NULL, SHGFP_TYPE_CURRENT, pszLink));

   if (bFound)
   {
      // Proceed to create the shortcut
      IShellLink *pIShellLink = NULL;
      IPersistFile *ppf = NULL;
      WCHAR pLinkUnicode[MAX_PATH];

      CoInitialize(NULL);

      // Get a pointer to the IShellLink interface.
      hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
                            IID_IShellLink, (void **)&pIShellLink);

      if (SUCCEEDED(hr))
      {
         // Get a pointer to IPersistFile interface for saving shortcut
         hr = pIShellLink->QueryInterface(IID_IPersistFile, (void **)&ppf);

         if (SUCCEEDED(hr))
         {   
            hr = pIShellLink->SetPath(pszShortcutFile);
            hr = pIShellLink->SetDescription(pszDescription);

            if (SUCCEEDED(hr))
            {
               // Add the target folder to the Start Menu Programs path
               lstrcat(pszLink, "\\");
               lstrcat(pszLink, pszRelativeFolder);
               lstrcat(pszLink, "\\");

               // Create the directory if it does not exist
               CreateDirectory(pszLink,NULL);

               // Add the file name for the shortcut
               lstrcat(pszLink, pszDescription);
               lstrcat(pszLink, ".lnk");

               // Convert string to Unicode, and call IPersistFile::Save()
               MultiByteToWideChar(CP_ACP, 0, pszLink, -1, pLinkUnicode, MAX_PATH);
               hr = ppf->Save(pLinkUnicode, TRUE);
            }
            ppf->Release();
         }
         pIShellLink->Release();
      }
      CoUninitialize();
   }

   return hr;
}
				
請參閱 SHGetSpecialFolderPath 和 SHGetFolderPath 決定可以取得這些函式的特殊資料夾的其他類型文件。請注意在範例中會將 CoInitialize 和 CoUnitialize 呼叫這個函式內。如果在其他函式中使用 COM,這些呼叫應該移動到移轉 DLL DllMain 函式。呼叫 CoInitialize DLL_PROCESS_ATTACH 通知和 CoUninitialize DLL_PROCESS_DETACH 通知。

?考

如需有關移轉 DLL 的詳細資訊,請參閱下列在 MSDN Library 主題:
平台 SDK; 管理服務; 安裝; 遷移擴充介面

屬性

文章編號: 241733 - 上次校閱: 2007年3月1日 - 版次: 3.4
這篇文章中的資訊適用於:
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows 98 Standard Edition
  • Microsoft Windows 95
關鍵字:?
kbmt kbfaq kbhowto kbmigrate kbsetup KB241733 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:241733
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com