如何获取一个迁移 DLL 的特殊文件夹的位置

文章翻译 文章翻译
文章编号: 241733 - 查看本文应用于的产品
展开全部 | 关闭全部

概要

在 Windows 2000 专业版来从 Windows 95 或 Windows 98 升级,迁移 DLL 可能需要访问特殊文件夹如 开始 菜单文件夹或桌面文件夹。在迁移 DLL 不能假定这些文件夹存在的位于默认位置。而是,它应使用 SHGetSpecialFolderPath 或 SHGetFolderPath。

更多信息

SHGetSpecialFolderPath 仅适用于 Windows 95 如果 Internet 浏览器 4.0 安装桌面更新。在 Windows 2000 SHGetSpecialFolderPath 将始终有效。然而,在这两种情况下最好使用新的 SHGetFolderPath API 是 SHGetSpecialFolderPath 的超集。若要在 Windows 95 或 Windows 98 上使用 SHGetFolderPath,您必须重新发布 SHFolder.dll 文件一起迁移 DLL。

您可以从最新的平台 SDK 中获得 SHFolder.dll。若要下载平台 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 函数。调用 DLL_PROCESS_ATTACH 通知和 CoUninitialize CoInitialize DLL_PROCESS_DETACH 通知。

参考

有关迁移 dll 的详细信息,请参阅 MSDN 库中的以下主题:
平台 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
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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