PRB: LoadLibrary() Fails with _declspec(thread)

Last reviewed: December 16, 1996
Article ID: Q118816
The information in this article applies to:
  • Microsoft Win32 Application Programming Interface (API) included with:

        - Microsoft Windows NT versions 3.5, 3.51, and 4.0
        - Microsoft Windows 95 version 4.0
        - Microsoft Win32s versions 1.1, 1.15, 1.2, and 1.25a
    

SYMPTOMS

Your dynamic-link library (DLL) uses __declspec(thread) to allocate thread local storage (TLS). There are no problems running an application that is statically linked with the DLL's import library. However, when an application uses LoadLibrary() to load the DLL instead of using the import library, LoadLibrary() fails on Win32s with "error 87: invalid parameter". LoadLibrary() succeeds under Windows NT in this situation; however, the application cannot successfully call functions in the DLL.

CAUSE

This is a limitation of LoadLibrary() and __declspec(). The global variable space for a thread is allocated at run time. The size is based on a calculation of the requirements of the application plus the requirements of all of the DLLs that are statically linked. When you use LoadLibrary(), there is no way to extend this space to allow for the thread local variables declared with __declspec(thread). This can cause a protection fault either when the DLL is dynamically loaded or code references the data.

RESOLUTION

DLLs that use __declspec(thread) should not be loaded with LoadLibrary().

Use the TLS APIs, such as TlsAlloc(), in your DLL to allocate TLS if the DLL might be loaded with LoadLibrary(). If you continue to use _declspec(), warn users of the DLL that they should not load the DLL with LoadLibrary().


KBCategory: kbprg kbprb
KBSubcategory: BseDll
Additional reference words: 1.10 1.15 1.20 1.25a 3.50 3.51 4.00 95


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: December 16, 1996
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.