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

文書翻訳 文書翻訳
文書番号: 241733 - 対象製品
この記事は、以前は次の 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 サイトを参照してください。
http://www.microsoft.com/msdownload/platformsdk/setuplauncher.htm
プラットフォーム 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 - 最終更新日: 2004年12月29日 - リビジョン: 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
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

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