Como obter o local de pastas especiais para uma DLL de migração

Traduções deste artigo Traduções deste artigo
ID do artigo: 241733 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sumário

Durante uma atualização do Windows 95 ou Windows 98 para o Windows 2000 Professional, uma migração DLL talvez queira pastas especiais de acesso, como a pasta menu Iniciar ou a pasta Desktop. Uma DLL de migração não pode presumir que essas pastas padrão existem locais. Em vez disso, ele deve usar SHGetSpecialFolderPath ou SHGetFolderPath.

Mais Informações

SHGetSpecialFolderPath só funcionarão no Windows 95 se o Internet Explorer 4.0 estiver instalado com a atualização da área de trabalho. No Windows 2000, SHGetSpecialFolderPath sempre funcionará. No entanto, em ambos os casos, é melhor usar a nova API SHGetFolderPath, que é um superconjunto de SHGetSpecialFolderPath. Para usar SHGetFolderPath no Windows 95 ou Windows 98, você deve redistribuir o arquivo SHFolder.dll junto com a DLL de migração.

Você pode obter SHFolder.dll o Platform SDK mais recente. Para baixar o SDK de plataforma, consulte o seguinte site:
http://www.microsoft.com/msdownload/platformsdk/setuplauncher.htm
Ao instalar o SDK de plataforma, certifique-se instalar componentes redistribuíveis e o ambiente de criação. Também, optar por integrar o Platform SDK com o Microsoft Visual C++ quando solicitado. Isso é necessário devido o arquivo SHFolder.h que é necessário. Depois que o Platform SDK é instalado, procure a pasta de instalação o redistribuível SHFolder.exe executável. Esse arquivo instala SHFolder.dll e todas as outras atualizações são necessárias para ele seja executado no Windows 95 ou Windows 98. Esse arquivo executável deve ser executado no computador do usuário quando o usuário coloca o DLL de migração no computador. Ele também pode ser instalado durante a instalação do aplicativo.

O código a seguir demonstra como obter um ponteiro para 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;
}
				

O código de exemplo a seguir demonstra um uso possível dessa função. Durante uma atualização para o Windows 2000, um aplicativo pode conter um programa do Windows 2000 específicas ou utilitário que requer um atalho na pasta de programas de menu Iniciar do aplicativo. Após copiar o novo programa para o computador, a DLL de migração pode adicionar um atalho ao menu Iniciar do usuário. Para uma configuração por usuário, a função MigrateUserNT é o melhor lugar para executar esta tarefa.

A função a seguir usa 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 de programas do menu Iniciar . Isso é 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 para SHGetSpecialFolderPath e SHGetFolderPath para determinar os outros tipos de pastas especiais que podem obter essas funções. Observe no exemplo a CoInitialize e CoUnitialize são chamados nessa função. Se for usada COM outras funções, essas chamadas devem ser movidas a função de DllMain da DLL de migração. Chame o CoInitialize para a notificação DLL_PROCESS_ATTACH e CoUninitialize para a notificação DLL_PROCESS_DETACH.

Referências

Para obter mais informações sobre DLLs de migração, consulte o tópico seguinte na biblioteca MSDN:
Platform SDK; serviços de gerenciamento; instalação; interface de extensão de migração

Propriedades

ID do artigo: 241733 - Última revisão: quinta-feira, 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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