Al momento sei offline in attesa che la connessione Internet venga ristabilita

PRB: Calling LoadLibrary() per caricare una DLL That Has Static TLS

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: 118816
Sintomi
Una libreria a collegamento dinamico (DLL) utilizza __declspec (thread) per allocare memoria locale di thread statica (TLS). Esistono meno problemi associati esegue un'applicazione collegata con la corrispondente libreria statica. Tuttavia, quando un'applicazione utilizza la funzione LoadLibrary per caricare la DLL invece di utilizzare la versione statica, LoadLibrary grado su Win32s con un codice di errore 87: parametro non valido.

LoadLibrary ha esito positivo in un computer che esegue Windows 98, Windows NT o Windows 2000 in questa situazione. Tuttavia, il comportamento della chiamata di funzioni che fanno riferimento a variabili statiche di TLS non è definito. In Microsoft Windows 95, si verifica un errore di LoadLibrary e il GetLastError funzionano restituisce 1114 - ERROR_DLL_INIT_FAILED (A collegamento dinamico libreria routine di inizializzazione non riuscita). In Windows 2000, la funzione LoadLibrary ha esito positivo. Tuttavia, qualsiasi tentativo di accedere ai dati TLS determina una violazione di accesso (AV).
Cause
Si tratta di una limitazione di LoadLibrary e __declspec . Lo spazio delle variabile globali per un thread è assegnato in fase di esecuzione. La dimensione si basa su un calcolo dei requisiti dell'applicazione più i requisiti di tutte le librerie collegate in modo statico di. Se una DLL utilizza statica ed è dinamico collegato in un'applicazione, quando viene chiamata LoadLibrary o FreeLibrary , il sistema deve trovare tutti i thread che esiste nel processo e ingrandiscono o compattare la memoria TLS in base alla dimensione del TLS statici nella DLL appena caricata. Questo processo è troppo grande per sistemi operativi gestire, che può causare un'eccezione quando la DLL viene caricata in modo dinamico o codice riferimenti i dati.
Risoluzione
DLL che utilizzano __declspec (thread) non deve essere caricata con LoadLibrary .

Il codice DLL deve essere modificato per utilizzare tali funzioni TLS come TlsAlloc e per l'assegnazione di TLS, se la DLL può essere caricata con LoadLibrary . In alternativa, la DLL che utilizza __declspec (thread) solo deve essere caricata in modo implicito nell'applicazione.
Informazioni
Per determinare se una DLL utilizza statica, è possibile utilizzare lo strumento Dumpbin.exe per scaricare le informazioni di intestazione. Una DLL è statica se OPTIONAL HEADER VALUES contiene una dimensione è maggiore di 0 (zero) in directory di archiviazione thread, come illustrato di seguito:
517B20 RVA [dimensione] [18] di thread di directory di archiviazione
1.10 1,20 3.50

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 118816 - Ultima revisione: 11/21/2006 15:29:52 - Revisione: 3.2

Microsoft Win32 Application Programming Interface

  • kbmt kbdll kbkernbase kbprb kbthread KB118816 KbMtit
Feedback
/html>