Erro: Mensagem de erro "Erro LNK2001" quando contactar o SHGetImageList no Windows XP com o sistema

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

Sintomas

Quando chama a função SHGetImageList num sistema baseado no Microsoft Windows XP, poderá receber a seguinte mensagem de erro:
Erro de MyFileName.obj: LNK2001: não resolvidos _SHGetImageList símbolo externo
Depurar / MyFileName.exe: erro fatal LNK1120: 1 não resolvidos externos
Erro ao executar link.exe.

Causa

A função SHGetImageList é suportada no Windows XP, como documentado no Platform SDK. No entanto, uma vez que esta função não é exportada por nome no ficheiro Shell32.dll, não está incluído na biblioteca de importação Shell32.lib incluída no Platform SDK.

Resolução

Para resolver este problema, utilize as funções LoadLibrary e GetProcAddress para chamar a função SHGetImageList por ordinal. O ordinal SHGetImageList é 727. Para este incidente específico, o ordinal pode ser contado não alteradas através de versões do sistema operativo, mas efectue não assumem isto para serem verdadeiras para qualquer outra aplicação programação interface (API), salvo indicação especificamente em contrário.

O seguinte código demonstra como chamar SHGetImageList por ordinal:
typedef HRESULT (STDMETHODCALLTYPE *SHGETIMAGELIST)(int, REFIID, void **);


STDAPI CallSHGetImageList(int iImageList, 
                          REFIID riid, 
                          void **ppv)
{
   HINSTANCE hinstShell32 = NULL;
   SHGETIMAGELIST pfn = NULL;
   HRESULT hr = S_OK;
   LPTSTR lpszLibPath = NULL;
   TCHAR tchBuffer[MAX_PATH*2];  
   lpszLibPath = tchBuffer; 

   GetSystemDirectory(lpszLibPath, MAX_PATH+1);  
   strcat(lpszLibPath, _T("\\SHELL32.DLL"));

   hinstShell32 = LoadLibrary(lpszLibPath);

   if (NULL == hinstShell32)
   {
         DWORD err = GetLastError();
         return HRESULT_FROM_WIN32(err);
   }

   // 
   // First, try to call the function by name.
   // 
   pfn = (SHGETIMAGELIST)GetProcAddress(hinstShell32, 
                                        (LPCSTR)"SHGetImageList");
   if (NULL == pfn)
   {
      //ONLY if the preceding call fails, try to call the function by ordinal 
    pfn = (SHGETIMAGELIST)GetProcAddress(hinstShell32,
                                           (LPCSTR)727);
      if (NULL == pfn)
      {
         hr = HRESULT_FROM_WIN32(GetLastError());
      }
   }

   if (NULL != pfn)
   {
      // 
      // Call the function.
      // 
      hr = (pfn)(iImageList, riid, ppv);
   }

   FreeLibrary(hinstShell32);
   return hr;
}
				

Ponto Da Situação

A Microsoft confirmou que este erro ocorre nos produtos da Microsoft listados no início deste artigo.

Propriedades

Artigo: 316931 - Última revisão: 11 de julho de 2005 - Revisão: 1.1
A informação contida neste artigo aplica-se a:
  • Microsoft Platform Software Development Kit-January 2000 Edition
Palavras-chave: 
kbmt kbbug kberrmsg kbpending KB316931 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: 316931

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