KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q107501: INFO: __declspec(dllexport) Replaces __export in 32-Bit VC++

Article: Q107501
Product(s): Microsoft C Compiler
Version(s): WINDOWS NT:1.0,2.0,4.0,5.0,6.0
Operating System(s): 
Keyword(s): kbLangC kbVC kbVC100 kbVC200 kbVC400 kbVC500 kbVC600
Last Modified: 10-MAY-2001

-------------------------------------------------------------------------------
The information in this article applies to:

- Microsoft Visual C++, versions 1.0, 2.0, 4.0 
- Microsoft Visual C++, 32-bit Enterprise Edition, versions 5.0, 6.0 
- Microsoft Visual C++, 32-bit Professional Edition, versions 5.0, 6.0 
- Microsoft Visual C++, 32-bit Learning Edition, version 6.0 
-------------------------------------------------------------------------------

SUMMARY
=======

The __export keyword provided with the Visual C++ for Windows compiler is
obsolete with the Microsoft Visual C++ 32-bit compiler. The equivalent
functionality for WIN32 can be achieved by using the keyword __declspec with the
dllexport attribute. With Visual C++ 32-bit Edition, version 4.0, compiling code
containing the __export (or _export) keyword results in either of the following
warnings:

  C4236: nonstandard extension used : '__export' is an obsolete keyword, see
  documentation for __declspec(dllexport)

  - or -

  C4226: nonstandard extension used : '__export' is an obsolete keyword

Compiling code containing the __export (or _export) keyword with 32-bit Visual
C++, versions 1.0 and 2.x, results in the C4226 warning.


MORE INFORMATION
================

The __declspec construct is not supported by the tools supplied with Microsoft
Win32 Software Development Kit (SDK).

When porting DLL source code from Windows to Win32, replace each instance of
__export with __declspec( dllexport ). The __declspec(dllexport) keyword can be
used to export data, functions, classes, or class member functions. For
example:

     /* exported function */ 
     __declspec( dllexport ) void func();

     /* exported data */ 
     __declspec( dllexport ) int i;

     // exported class
     class __declspec( dllexport ) DLLClass
     {
        ...
     };

     class DLLClass
     {
     public:
         // exported member function
         __declspec( dllexport ) void MemberFunction( void );
     };

The sample code below demonstrates exporting classes and class member functions
from a DLL using the __declspec( dllexport ) and __declspec( dllimport ) storage
class attributes in the DLL and EXE, respectively.

Sample Code
-----------

     /* DLL Sample: TESTDLL.CPP
     /* Compile options needed: /D"_X86" /MT TESTDLL.CPP /link
     /*                  /DLL /OUT:testdll.dll /implib:testdll.lib
     */ 

     #include <stdio.h>

     class DLLClass
         {
         public:
          // exported member function
          __declspec( dllexport ) void functionA( void ) {
              printf("\nIn Function A of the exported function");
          }
         };

     // exported class
     class __declspec( dllexport) ExportDLLClass
         {
         public:
          void functionB(void) {
             printf("\nIn Function B of the exported class");
          }
         };

     // exported instance of the DLLClass
     __declspec(dllexport) DLLClass test;

     /* Source that calls the DLL Sample: CALLDLL.CPP
     /* Compile options needed: /D"_X86" /D"_CONSOLE" /ML CALLDLL.CPP
     /*                  TESTDLL.LIB
     */ 

     #include <stdio.h>

     class DLLClass
         {
         public:
          // imported member function
          __declspec( dllimport ) void functionA( void );
         };

     class __declspec( dllimport) ExportDLLClass
         {
         public:
          void functionB(void);
         };

     __declspec( dllimport ) DLLClass test;

     void main(void)
     {
        ExportDLLClass TestClass;

        test.functionA();
        TestClass.functionB();
     }

REFERENCES
==========

For more information on exporting, query on the following words in the Microsoft
Knowledge Base:

  __export and def and prolog and dllexport


For more information creating DLLs for WIN32 or on the dllexport and dllimport
storage class attributes, refer to Chapter 4 of the "Programming Techniques"
manual that ships with Visual C++ 32-bit Edition, or search for dllexport or
dllimport or export in the Visual C++ Books Online. >From within the Visual
Workbench, select Help and choose Keyword Search.

Additional query words: 8.00 9.00

======================================================================
Keywords          : kbLangC kbVC kbVC100 kbVC200 kbVC400 kbVC500 kbVC600 
Technology        : kbVCsearch kbVC400 kbAudDeveloper kbvc100 kbVC500 kbVC600 kbVC200 kbVC32bitSearch kbVC500Search
Version           : WINDOWS NT:1.0,2.0,4.0,5.0,6.0

=============================================================================

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.

Copyright Microsoft Corporation 1986-2002.