Como obter a localização das pastas especiais para uma DLL de migração

Traduções de Artigos Traduções de Artigos
Artigo: 241733 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

Durante uma actualização a partir do Windows 95 ou Windows 98 para o Windows 2000 Professional, uma migração DLL querer acesso a pastas especiais, tais como a pasta do menu Iniciar ou a pasta Ambiente de trabalho. Um DLL de migração não é possível assumir que estas pastas existem predefinido localizações. Em vez disso, deve utilizar SHGetSpecialFolderPath ou SHGetFolderPath.

Mais Informação

SHGetSpecialFolderPath só funcionará no Windows 95 se o Internet Explorer 4.0 estiver instalado com a actualização do ambiente de trabalho. No Windows 2000, SHGetSpecialFolderPath sempre funcionará. No entanto, em ambos os casos, é melhor utilizar a nova API SHGetFolderPath, que é um superconjunto da SHGetSpecialFolderPath. Para utilizar SHGetFolderPath no Windows 95 ou Windows 98, tem de redistribuem o ficheiro SHFolder.dll juntamente com a DLL de migração.

Pode obter SHFolder.dll do Platform SDK mais recente. Para transferir o Platform SDK, consulte o seguinte Web site:
http://www.microsoft.com/msdownload/platformsdk/setuplauncher.htm
Quando instalar o Platform SDK, certifique-se instalar os componentes redistribuíveis e o ambiente de compilação. Também escolher integrar o Microsoft Visual C++ quando lhe for pedido o Platform SDK. Isto é necessário porque do ficheiro SHFolder.h que é necessário. Depois de instalar o Platform SDK, procure a pasta de instalação de SHFolder.exe executável redistribuível. Este ficheiro instala SHFolder.dll e todas as outras actualizações que são necessários para que seja executado no Windows 95 ou Windows 98. Este ficheiro executável deve ser executado no computador do utilizador quando o utilizador coloca o DLL de migração no computador. Também pode ser instalado durante a configuração da aplicação.

O seguinte código demonstra como obter um apontador para 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;
}
				

O código de exemplo seguinte demonstra uma possível utilização desta função. Durante uma actualização para o Windows 2000, uma aplicação pode conter um programa específicas do Windows 2000 ou o utilitário que requer um atalho na pasta ' programas ' menu Iniciar a aplicação. Depois de copiar o novo programa para o computador, a DLL de migração pode adicionar um atalho ao menu Iniciar do utilizador. Para uma definição por utilizador, a função de MigrateUserNT é o melhor local para efectuar esta tarefa.

A função seguinte tem três parâmetros. O primeiro parâmetro é o caminho para o executável de destino. O segundo parâmetro é uma descrição. O parâmetro final é uma subpasta que será criada na pasta programas do menu Iniciar . Esta é onde o atalho será criado.
#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;
}
				
Consulte a documentação determinar os tipos de pastas especiais que estas funções podem obter SHGetSpecialFolderPath e SHGetFolderPath. Repare no exemplo que CoInitialize e CoUnitialize são denominados dentro desta função. Se for utilizada COM outras funções, estas chamadas devem ser movidas para DllMain função a DLL de migração. Chamar CoInitialize para a notificação de DLL_PROCESS_ATTACH e CoUninitialize da notificação DLL_PROCESS_DETACH.

Referências

Para mais informações sobre DLLs de migração, consulte o tópico seguinte na MSDN Library:
O Platform SDK serviços de gestão de programa de configuração; extensão de migração de interface

Propriedades

Artigo: 241733 - Última revisão: 1 de março de 2007 - Revisão: 3.4
A informação contida neste artigo aplica-se a:
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows 98 Standard Edition
  • Microsoft Windows 95
Palavras-chave: 
kbmt kbfaq kbhowto kbmigrate kbsetup KB241733 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 241733

Submeter comentários

 

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