現在オフラインです。再接続するためにインターネットの接続を待っています

[HOWTO] 移行 DLL の特別なフォルダの場所を取得する方法

この記事は、以前は次の ID で公開されていました: JP241733
概要
Windows 95 または Windows 98 から Windows 2000 Professional にアップグレード中、[スタート] メニュー フォルダやデスクトップ フォルダなどの特別なフォルダに移行 DLL がアクセスしようとすることがあります。移行 DLL は、これらのフォルダがデフォルトの場所に存在することを想定していません。代わりに、SHGetSpecialFolderPath または SHGetFolderPath を使用します。
詳細
SHGetSpecialFolderPath は、デスクトップのアップデートで Internet Explorer 4.0 をインストールする場合、Windows 95 だけで機能します。Windows 2000 では、SHGetSpecialFolderPath が常に機能します。ただし、どちらの場合も、新しい SHGetFolderPath API を使用することが最適です。これは、SHGetSpecialFolderPath のスーパーセットです。Windows 95 または Windows 98 で SHGetFolderPath を使用するには、移行 DLL と一緒に SHFolder.dll ファイルを再配布する必要があります。

最新のプラットフォーム SDK から SHFolder.dll を取得できます。プラットフォーム SDK をダウンロードするには、次の Web サイトを参照してください。プラットフォーム SDK をインストールするときには、再配布可能コンポーネントとビルド環境をインストールします。さらに、メッセージが表示されたときに、プラットフォーム SDK を Microsoft Visual C++ と統合することを選択します。この操作は、SHFolder.h ファイルのために必要です。プラットフォーム SDK をインストールするとすぐに、再配布可能な実行形式の SHFolder.exe のインストール フォルダを検索します。このファイルは、SHFolder.dll、および Windows 95 または Windows 98 で実行するために SHFolder.dll が必要とする他のすべてのアップデートをインストールします。ユーザーが移行 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 関数がこの作業を実行するのに最適な場所です。

次の関数は 3 つのパラメータを受け取ります。最初のパラメータは、対象となる実行可能ファイルへのパスです。2 番目のパラメータは説明です。最後のパラメータは、[スタート] メニューのプログラム フォルダに作成されるサブフォルダです。これはショートカットを作成する場所です。
#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 関数に移動する必要があります。DLL_PROCESS_ATTACH 通知の CoInitialize と DLL_PROCESS_DETACH 通知の CoUninitialize を呼び出します。
関連情報
移行 DLL の詳細については、MSDN ライブラリにある次のトピックを参照してください。
Platform SDK; Management Services; Setup; Migration-Extension Interface
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 241733 (最終更新日 2001-07-30) をもとに作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

プロパティ

文書番号:241733 - 最終更新日: 12/29/2004 19:45:00 - リビジョン: 4.1

  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Professional
  • Microsoft Windows 98 Standard Edition
  • Microsoft Windows 95
  • kbhowto kboswin2000 kboswin98 kboswin95 kbmigrate kbsetup kbfaq kbgrpdstools kbmigrationdllfaq kbmigwin9xtowin2k KB241733
フィードバック