Identificativo articolo: 316931 - Ultima modifica: lunedì 11 luglio 2005 - Revisione: 1.1

BUG: "Errore LNK2001" errore quando si chiama SHGetImageList in un sistema XP su Windows

Suggerimento di sistemaIl presente articolo fa riferimento a un sistema operativo diverso da quello in uso. Il contenuto dell'articolo che potrebbe non essere relativo al sistema in uso è disabilitato.
Espandi tutto | Chiudi tutto

Sintomi

Quando si chiama la funzione SHGetImageList su un sistema basato su Microsoft Windows XP, viene potrebbe essere visualizzato il seguente messaggio di errore:
MyFileName.obj: errore LNK2001: non risolti _SHGetImageList simbolo esterno
Eseguire il debug / MyFileName.exe: errore irreversibile LNK1120: esterni non risolti 1
Errore durante l'esecuzione link.exe.

Cause

La funzione di SHGetImageList è supportata in Windows XP, come descritto in Platform SDK. Tuttavia, poiché questa funzione non viene esportata con nome in file Shell32.dll, non è incluso nella libreria di importazione Shell32.lib incluso in Platform SDK.

Risoluzione

Per risolvere il problema, è possibile utilizzare le funzioni LoadLibrary e GetProcAddress per chiamare la funzione SHGetImageList per ordinale. Il numero ordinale SHGetImageList è 727. In questo caso particolare, il numero ordinale quantificabile per non modificare in versioni del sistema operativo, ma non si supponga che questo è true per qualsiasi altro API application programming interface (), salvo diversa indicazione.

Il codice riportato di seguito viene illustrato come chiamare SHGetImageList in base al numero ordinale:
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;
}
				

Status

Microsoft ha confermato che questo un bug nei prodotti Microsoft elencati all'inizio di questo articolo.

Le informazioni in questo articolo si applicano a:
  • Microsoft Platform Software Development Kit-edizione gennaio 2000
Chiavi: 
kbmt kbbug kberrmsg kbpending KB316931 KbMtit
Traduzione automatica articoliTraduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 316931  (http://support.microsoft.com/kb/316931/en-us/ )
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.