Как получить расположение специальных папок для DLL миграции

Переводы статьи Переводы статьи
Код статьи: 241733 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Аннотация

При обновлении Windows 95 или Windows 98 до Windows 2000 Professional, Библиотека миграции может потребоваться доступ к специальные папки, такие как Начало меню папки или папки рабочего стола. Библиотека миграции нельзя предполагать, эти папки по умолчанию существует мест. Вместо этого следует использовать SHGetSpecialFolderPath или SHGetFolderPath.

Дополнительная информация

SHGetSpecialFolderPath будет работать только под управлением Windows 95 при установки Internet Explorer 4.0 с рабочего стола. В Windows 2000 SHGetSpecialFolderPath всегда будет работать. Однако в обоих случаях лучше использовать новый интерфейс API SHGetFolderPath, который включает в себя SHGetSpecialFolderPath. Использование SHGetFolderPath в Windows 95 или Windows 98, необходимо распространять файл SHFolder.dll вместе с DLL миграции.

SHFolder.dll можно получить последнюю версию пакета Platform SDK. Для загрузки пакета Platform SDK, просмотра веб-узла:
http://www.Microsoft.com/msdownload/platformsdk/setuplauncher.htm
При установке пакета Platform SDK, убедитесь, что установить свободно распространяемые компоненты и среду сборки. Кроме того выберите для интеграции с Microsoft Visual C++ в ответ на запрос Platform SDK. Это необходимо из-за необходимого файла SHFolder.h. После установки пакета Platform SDK поиск папки установки распространяемого исполняемый файл SHFolder.exe. Этот файл устанавливает SHFolder.dll и другие обновления, необходимые для запуска Windows 95 или Windows 98. Этот исполняемый файл следует запускать на компьютере пользователя, когда пользователь наводит миграции библиотеки DLL на компьютере. Он может также устанавливаться во время установки приложения.

Следующий код демонстрирует получить указатель на интерфейс API SHGetFolderPath:
#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 или служебной программы, требующей ярлык в приложении Начало Папка меню программы. После копирования новую программу на компьютер, Библиотека миграции можно добавить ярлык для пользователя Начало меню. Для настройки каждого пользователя, функция 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 используется в других функциях, следует переместить эти вызовы функции DllMain DLL миграции. Вызовите уведомление DLL_PROCESS_DETACH для уведомления DLL_PROCESS_ATTACH и CoUninitialize CoInitialize.

Ссылки

Дополнительные сведения о библиотеках DLL миграции содержатся в разделе, следующие в библиотеке MSDN:
Комплект разработчика Platform SDK; Службы управления; Программа установки; Интерфейс модуля миграции

Свойства

Код статьи: 241733 - Последний отзыв: 4 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • операционная система Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
  • Операционная система Microsoft Windows 95
Ключевые слова: 
kbFAQ kbhowto kbmigrate kbsetup kbmt KB241733 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:241733

Отправить отзыв

 

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