Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

Ihr Browser wird nicht unterstützt.

Sie müssen Ihren Browser aktualisieren, um die Website zu verwenden.

Aktualisieren Sie auf die neueste Version von Internet Explorer.

PRB: LoadLibrary() zum Laden einer DLL, welche einen statischen TLS besitzt, aufrufen

Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 118816
Problembeschreibung
Eine Dynamic Link Library (DLL) verwendet __declspec(Thread), um statischen lokalen Threadspeicher (TLS) zu reservieren. Es gibt keine Probleme im Zusammenhang mit der Ausführung einer Anwendung, die verknüpft ist mit den entsprechenden statischen Bibliothek. Jedoch, wenn eine Anwendung die LoadLibrary-Funktion verwendet, um eine DLL zu laden, anstatt der statischen Version, führt LoadLibrary auf Win32-Systemen zum Fehlercode 87: Ungültiger Parameter.

LoadLibrary ist auf einem Computer mit Windows 98, Windows NT oder Windows 2000 in diesem Fall erfolgreich. Allerdings ist der Aufruf von Funktionen in der DLL, die statische TLS-Variablen verweisen, die nicht definiert. Unter Microsoft Windows 95-Funktion LoadLibrary fehlgeschlagen und die GetLastError gibt 1114 - ERROR_DLL_INIT_FAILED (eine dynamic Link Library-Initialisierungsroutine ist fehlgeschlagen). Unter Windows 2000 wird die LoadLibrary -Funktion. Jeder Versuch, den Datenzugriff TLS verursacht jedoch eine Zugriffsverletzung (AV).
Ursache
Dies ist eine Einschränkung der LoadLibrary und __declspec. Zur Laufzeit wird der globale Variablenspeicher für einen Thread zugewiesen. Die Größe basiert auf der Berechnung der Anforderungen der Anwendung sowie der Anforderungen aller Bibliotheken, die statisch gebunden sind. Wenn eine DLL statische TLS verwendet und Dynamic Link in einer Anwendung LoadLibrary oder FreeLibrary aufgerufen wird, muss das System alle Threads finden, die im Prozess vorhanden und vergrößern oder deren TLS Speicher entsprechend der Größe der in der neu geladenen DLL statische TLS komprimieren. Dieser Vorgang ist zu viel für Betriebssysteme zu verwalten, die eine Ausnahme auslösen, wenn die DLL dynamisch geladen wird oder Verweise die Daten codiert.
Lösung
DLLs, die mit __declspec(Thread) sollten nicht mit LoadLibrarygeladen werden.

Der DLL-Code muss geändert werden, solche TLS-Funktionen wie TlsAllocverwenden und TLS zuweisen, wenn die DLL mit LoadLibrarygeladen wird. Oder die DLL, die mit __declspec(Thread) ist sollte nur implizit in die Anwendung geladen wird.
Weitere Informationen
Bestimmen, ob eine DLL statische TLS verwendet, kann das Tool Dumpbin.exe verwendet werden, um die Headerinformationen speichern. Eine DLL hat statische TLS enthält OPTIONAL HEADER VALUES eine Größe, die größer als 0 (null) in das Speicherverzeichnis Thread lautet folgendermaßen:
517B20 [18] RVA [Größe] des Speicherverzeichnisses für Thread
1.10 1,20 3,50

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 118816 – Letzte Überarbeitung: 07/03/2015 18:42:00 – Revision: 4.0

  • Microsoft Win32 Application Programming Interface
  • kbdll kbkernbase kbprb kbthread kbmt KB118816 KbMtde
Feedback
://c1.microsoft.com/c.gif?DI=4050&did=1&t=">p;t=">.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?"> >>did=1&t=">cation.protocol) + "//c.microsoft.com/ms.js'><\/script>");