<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[dll exportieren, statisch importieren, dynamisch importieren]]></title><description><![CDATA[<p>Hier mal ein ungefragter Vorschlag, wie man ganz problemlos DLL-Funktionen exportieren und statisch oder dynamisch importieren kann.<br />
Als Vorschlag für den DLL-Thread in der FAQ</p>
<p>Header (für Ex- und Import zu verwenden)</p>
<pre><code class="language-cpp">/*---------------------------------------------------------------------------

  Hinweise für Ex- und Import der DLL-Funktionen

  Exportieren: - Define MY_DLLNAME_EXPORT setzen (globale Compilereinstellung

  Importieren:

    statisch:  - define MY_DLLNAME_STATIC_IMPORT setzen (globale Compilereinstellung)
    dynamisch: - define MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION setzen (global).
               - cpp-File erstellen, welcher des Header wie folgt includiert:
                 #define MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION
                 #include &quot;dsConverterFunctions.h&quot;
                 //BEACHTE: dsConverterFunctions.h genau EIN einziges mal mit
                 //         dem Define MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION
                 //         importieren

  BEACHTE: die Qualifiers verhalten sich im C++Builder und VisualC genau
           entgegengesetzt!
           Im C++Builder sind sie als mit __stdcall, in VC mit __cdecl zu
           importieren. Zu diesem Zweck das Define MY_DLLNAME_BDB oder
           MY_DLLNAME_VC setzen. Sind beide nicht gesetzt, wird standardmäßig
           __cdecl verwendet.

---------------------------------------------------------------------------*/

#ifndef mydllH
#define mydllH  //include-Wächter

//---------------------------------------------------------------------------
//Compilerschalter für Import und Export

#ifdef MY_DLLNAME_BCB
  #define     MY_DLLNAME_QUALIFIER __stdcall
#else
  #ifdef MY_DLLNAME_VC
    #define   MY_DLLNAME_QUALIFIER __cdecl
  #else
    #define   MY_DLLNAME_QUALIFIER __cdecl
  #endif
#endif

#ifdef        MY_DLLNAME_EXPORT

  #define                                                                                    \
                  MY_DLLNAME_DLL_FUNCTION_DECLARATION( MY_DLLNAME_dll_qualifier,             \
                                                       MY_DLLNAME_dll_returntype,            \
                                                       MY_DLLNAME_dll_functionname)          \
                    __declspec(dllexport)
             \ 
                    MY_DLLNAME_dll_returntype                                                \
                    MY_DLLNAME_dll_qualifier                                                 \
                   MY_DLLNAME_dll_functionname
#else
  #ifdef      MY_DLLNAME_STATIC_IMPORT
    #define                                                                                  \
                  MY_DLLNAME_DLL_FUNCTION_DECLARATION( MY_DLLNAME_dll_qualifier,             \
                                                       MY_DLLNAME_dll_returntype,            \
                                                       MY_DLLNAME_dll_functionname)          \
                    __declspec(dllexport)
             \
                    MY_DLLNAME_dll_returntype                                                \
                    MY_DLLNAME_dll_qualifier                                                 \
                   MY_DLLNAME_dll_functionname
  #else
    #ifdef    MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION
      #ifndef MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION_FUN_PTR

        #define                                                                              \
                  MY_DLLNAME_DLL_FUNCTION_DECLARATION( MY_DLLNAME_dll_qualifier,             \
                                                       MY_DLLNAME_dll_returntype,            \
                                                       MY_DLLNAME_dll_functionname)          \
                                                                                             \
                                                                                             \
                    MY_DLLNAME_dll_returntype                                                \
                    MY_DLLNAME_dll_qualifier                                                 \
                   (*MY_DLLNAME_dll_functionname)
      #else
        #undef    MY_DLLNAME_DLL_FUNCTION_DECLARATION
        #define                                                                              \
                  MY_DLLNAME_DLL_FUNCTION_DECLARATION( MY_DLLNAME_dll_qualifier,             \
                                                       MY_DLLNAME_dll_returntype,            \
                                                       MY_DLLNAME_dll_functionname)          \
                                                                                             \
                   typedef                                                                   \
                    MY_DLLNAME_dll_returntype                                                \
                    MY_DLLNAME_dll_qualifier                                                 \
                   (*MY_DLLNAME_dll_functionname)
      #endif
    #else
      #ifdef MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION
        #define                                                                              \
                  MY_DLLNAME_DLL_FUNCTION_DECLARATION( MY_DLLNAME_dll_qualifier,             \
                                                       MY_DLLNAME_dll_returntype,            \
                                                       MY_DLLNAME_dll_functionname)          \
                                                                                             \
                   extern                                                                 \
                    MY_DLLNAME_dll_returntype                                                \
                    MY_DLLNAME_dll_qualifier                                                 \
                   (*MY_DLLNAME_dll_functionname)
      #else
        #error zum Einbinden des Headers müssen folgende defines gesetzt sein :              \
               MY_DLLNAME_EXPORT                     Exportieren der Funktionen              \
                                                     (für das Compilieren der DLL)           \
               MY_DLLNAME_STATIC_IMPORT              Für das statische Importieren der DLL   \
               MY_DLLNAME_DYNAMIC_IMPORT_DEFIONITION Genau einmal in einem Projekt, in       \
                                                     welchem die DLL dynamisch geladen       \
                                                     werden soll. Der Aufruf von dsLoadDLL   \
                                                     importiert die Funktionen (in           \
                                                     Kombination mit                         \
                                                     MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION). \
               MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION Funktionsdeklaration in einem Projekt   \
                                                     in dem die DLL dynamisch geladen wurde
      #endif
    #endif
  #endif
#endif

//Compilerschalter für Import und Export
//---------------------------------------------------------------------------
//Deklaration der Funktionen

extern &quot;C&quot;
{

  /** Beispiel für eine Funktion */
  DAYSECONDS_DLL_FUNCTION_DECLARATION
  (  DAYSECONDS_QUALIFIER,                //Qualifizierer
     int,                                 //Rückgabewert
    foo)( const long bar);                //Funktionsname und Parameter
}

//Deklaration der Funktionen
//----------------------------------------------
//dynamische Importieren der Funktionen

#ifdef  MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION

  #include &quot;windows.h&quot;

  #ifdef MY_DLLNAME_LOAD_FUN
    #error Header &quot;mydll.h&quot; bei gesetztem define                  \
           MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION nur EINMAL pro Projekt einbinden
  #endif

  #ifndef MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION
    #error Bei gesetztem MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION auch das           \
           define MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION setzen

  #endif

  #ifndef MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION_FUN_PTR
    #define MY_DLLNAMEDYNAMIC_IMPORT_DEFINITION_FUN_PTR

    #define FOO

    namespace  //unnamed
    {
      namespace MY_DLLNAME_funptr                  //über den Namensraum wird der Funktionszeiger-Typ von der 
      {                                            //Funktionszeiger-Variable unterschieden
        #undef mydllH                              //include-Wächter ausschalten
          #include &quot;dsConverterFunctions.h&quot;        //Funktions-ptr-Type-Deklaration
        #define mydllH
      }
    }
    #undef MY_DLLNAMEDYNAMIC_IMPORT_DEFINITION_FUN_PTR
  #endif

  #ifndef MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION_FUN_PTR

    #define MY_DLLNAME_LOAD_FUN( FUN_PTR_NAME,                                                                  \
                                 FUN_NAME_ASSTRING)                                                              \
              FUN_PTR_NAME = MY_DLLNAME_funptr::FUN_PTR_NAME(GetProcAddress( dll, FUN_NAME_ASSTRING));       \
              if(!FUN_PTR_NAME) reportError( FUN_NAME_ASSTRING);

    /** Lädt die Funktionen der DLL dynamisch.

        Liefert 1 als Rückgabewert, wenn die DLL nicht gefunden wurde, sonst 0.

        @param reportError Diese Funktion wird aufgerufen, wenn die geladene
                           DLL eine Funktion nicht unterstützt. Übergeben wird
                           der Name der Funktion  */

     int
    dsLoadDll( void(*reportError)( const char*) )
    {
      assert( NULL != reportError);

       HANDLE
      dll( (LoadLibrary(&quot;dayseconds.dll&quot;)));

      if(!dll) return 1;

      //Code zum Laden der Funktionen
      DAYSECONDS_LOAD_FUN( foo, &quot;_foo&quot;);
      return 0;
    }
  #endif
#endif

#endif //include-Wächter
</code></pre>
<p>Zugehöriger Export (DLL-Seite)</p>
<pre><code class="language-cpp">//MY_DLLNAME_EXPORT muss gesetzt sein
#include &quot;myDll&quot;

extern &quot;C&quot;
{
  DAYSECONDS_DLL_FUNCTION_DECLARATION
  (  DAYSECONDS_QUALIFIER,             
     int,                               
    foo)( const long bar)               
    {
      //whatever
      return 0;
    }
}
</code></pre>
<p>zugehöriger dynamischer Import (Client-Seite)</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

//MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION muss gesetzt sein
#define MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION
#include &quot;myDll.h&quot;
//BEACHTE: myDll.h genau EIN einziges mal mit
//         dem Define MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION
//         importieren

 namespace
client
{
   void
  notLoadable( const char* msg)
  {
    std::cerr &lt;&lt; &quot;Funktion '&quot;&lt;&lt;msg&lt;&lt;&quot;' konnte nicht aus der daySeconds.dll geladen werden.\n&quot;&lt;&lt;;
  };

  /** Lädt die dll &quot;MyDLL&quot; dynamisch.*/
   void
  loadMyDll()
  {
     static
     bool
    loaded(false);  //es wird nur einmal geladen

    if(!loaded)
    {
      if (dsLoadDll( notLoadable))
      {
         std::cerr &lt;&lt; &quot;daySeconds.dll konnte nicht geladen werden&quot;;
      }
    }
  }

   void
  doSomething()
  {
    //...
     int
    foosValue( foo(13));  //Aufruf der DLL-Funktion
  }
} //clent
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/67205/dll-exportieren-statisch-importieren-dynamisch-importieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Apr 2026 05:16:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/67205.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Mar 2004 22:32:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to dll exportieren, statisch importieren, dynamisch importieren on Mon, 08 Mar 2004 08:45:28 GMT]]></title><description><![CDATA[<p>Hier mal ein ungefragter Vorschlag, wie man ganz problemlos DLL-Funktionen exportieren und statisch oder dynamisch importieren kann.<br />
Als Vorschlag für den DLL-Thread in der FAQ</p>
<p>Header (für Ex- und Import zu verwenden)</p>
<pre><code class="language-cpp">/*---------------------------------------------------------------------------

  Hinweise für Ex- und Import der DLL-Funktionen

  Exportieren: - Define MY_DLLNAME_EXPORT setzen (globale Compilereinstellung

  Importieren:

    statisch:  - define MY_DLLNAME_STATIC_IMPORT setzen (globale Compilereinstellung)
    dynamisch: - define MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION setzen (global).
               - cpp-File erstellen, welcher des Header wie folgt includiert:
                 #define MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION
                 #include &quot;dsConverterFunctions.h&quot;
                 //BEACHTE: dsConverterFunctions.h genau EIN einziges mal mit
                 //         dem Define MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION
                 //         importieren

  BEACHTE: die Qualifiers verhalten sich im C++Builder und VisualC genau
           entgegengesetzt!
           Im C++Builder sind sie als mit __stdcall, in VC mit __cdecl zu
           importieren. Zu diesem Zweck das Define MY_DLLNAME_BDB oder
           MY_DLLNAME_VC setzen. Sind beide nicht gesetzt, wird standardmäßig
           __cdecl verwendet.

---------------------------------------------------------------------------*/

#ifndef mydllH
#define mydllH  //include-Wächter

//---------------------------------------------------------------------------
//Compilerschalter für Import und Export

#ifdef MY_DLLNAME_BCB
  #define     MY_DLLNAME_QUALIFIER __stdcall
#else
  #ifdef MY_DLLNAME_VC
    #define   MY_DLLNAME_QUALIFIER __cdecl
  #else
    #define   MY_DLLNAME_QUALIFIER __cdecl
  #endif
#endif

#ifdef        MY_DLLNAME_EXPORT

  #define                                                                                    \
                  MY_DLLNAME_DLL_FUNCTION_DECLARATION( MY_DLLNAME_dll_qualifier,             \
                                                       MY_DLLNAME_dll_returntype,            \
                                                       MY_DLLNAME_dll_functionname)          \
                    __declspec(dllexport)
             \ 
                    MY_DLLNAME_dll_returntype                                                \
                    MY_DLLNAME_dll_qualifier                                                 \
                   MY_DLLNAME_dll_functionname
#else
  #ifdef      MY_DLLNAME_STATIC_IMPORT
    #define                                                                                  \
                  MY_DLLNAME_DLL_FUNCTION_DECLARATION( MY_DLLNAME_dll_qualifier,             \
                                                       MY_DLLNAME_dll_returntype,            \
                                                       MY_DLLNAME_dll_functionname)          \
                    __declspec(dllexport)
             \
                    MY_DLLNAME_dll_returntype                                                \
                    MY_DLLNAME_dll_qualifier                                                 \
                   MY_DLLNAME_dll_functionname
  #else
    #ifdef    MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION
      #ifndef MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION_FUN_PTR

        #define                                                                              \
                  MY_DLLNAME_DLL_FUNCTION_DECLARATION( MY_DLLNAME_dll_qualifier,             \
                                                       MY_DLLNAME_dll_returntype,            \
                                                       MY_DLLNAME_dll_functionname)          \
                                                                                             \
                                                                                             \
                    MY_DLLNAME_dll_returntype                                                \
                    MY_DLLNAME_dll_qualifier                                                 \
                   (*MY_DLLNAME_dll_functionname)
      #else
        #undef    MY_DLLNAME_DLL_FUNCTION_DECLARATION
        #define                                                                              \
                  MY_DLLNAME_DLL_FUNCTION_DECLARATION( MY_DLLNAME_dll_qualifier,             \
                                                       MY_DLLNAME_dll_returntype,            \
                                                       MY_DLLNAME_dll_functionname)          \
                                                                                             \
                   typedef                                                                   \
                    MY_DLLNAME_dll_returntype                                                \
                    MY_DLLNAME_dll_qualifier                                                 \
                   (*MY_DLLNAME_dll_functionname)
      #endif
    #else
      #ifdef MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION
        #define                                                                              \
                  MY_DLLNAME_DLL_FUNCTION_DECLARATION( MY_DLLNAME_dll_qualifier,             \
                                                       MY_DLLNAME_dll_returntype,            \
                                                       MY_DLLNAME_dll_functionname)          \
                                                                                             \
                   extern                                                                 \
                    MY_DLLNAME_dll_returntype                                                \
                    MY_DLLNAME_dll_qualifier                                                 \
                   (*MY_DLLNAME_dll_functionname)
      #else
        #error zum Einbinden des Headers müssen folgende defines gesetzt sein :              \
               MY_DLLNAME_EXPORT                     Exportieren der Funktionen              \
                                                     (für das Compilieren der DLL)           \
               MY_DLLNAME_STATIC_IMPORT              Für das statische Importieren der DLL   \
               MY_DLLNAME_DYNAMIC_IMPORT_DEFIONITION Genau einmal in einem Projekt, in       \
                                                     welchem die DLL dynamisch geladen       \
                                                     werden soll. Der Aufruf von dsLoadDLL   \
                                                     importiert die Funktionen (in           \
                                                     Kombination mit                         \
                                                     MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION). \
               MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION Funktionsdeklaration in einem Projekt   \
                                                     in dem die DLL dynamisch geladen wurde
      #endif
    #endif
  #endif
#endif

//Compilerschalter für Import und Export
//---------------------------------------------------------------------------
//Deklaration der Funktionen

extern &quot;C&quot;
{

  /** Beispiel für eine Funktion */
  DAYSECONDS_DLL_FUNCTION_DECLARATION
  (  DAYSECONDS_QUALIFIER,                //Qualifizierer
     int,                                 //Rückgabewert
    foo)( const long bar);                //Funktionsname und Parameter
}

//Deklaration der Funktionen
//----------------------------------------------
//dynamische Importieren der Funktionen

#ifdef  MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION

  #include &quot;windows.h&quot;

  #ifdef MY_DLLNAME_LOAD_FUN
    #error Header &quot;mydll.h&quot; bei gesetztem define                  \
           MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION nur EINMAL pro Projekt einbinden
  #endif

  #ifndef MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION
    #error Bei gesetztem MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION auch das           \
           define MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION setzen

  #endif

  #ifndef MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION_FUN_PTR
    #define MY_DLLNAMEDYNAMIC_IMPORT_DEFINITION_FUN_PTR

    #define FOO

    namespace  //unnamed
    {
      namespace MY_DLLNAME_funptr                  //über den Namensraum wird der Funktionszeiger-Typ von der 
      {                                            //Funktionszeiger-Variable unterschieden
        #undef mydllH                              //include-Wächter ausschalten
          #include &quot;dsConverterFunctions.h&quot;        //Funktions-ptr-Type-Deklaration
        #define mydllH
      }
    }
    #undef MY_DLLNAMEDYNAMIC_IMPORT_DEFINITION_FUN_PTR
  #endif

  #ifndef MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION_FUN_PTR

    #define MY_DLLNAME_LOAD_FUN( FUN_PTR_NAME,                                                                  \
                                 FUN_NAME_ASSTRING)                                                              \
              FUN_PTR_NAME = MY_DLLNAME_funptr::FUN_PTR_NAME(GetProcAddress( dll, FUN_NAME_ASSTRING));       \
              if(!FUN_PTR_NAME) reportError( FUN_NAME_ASSTRING);

    /** Lädt die Funktionen der DLL dynamisch.

        Liefert 1 als Rückgabewert, wenn die DLL nicht gefunden wurde, sonst 0.

        @param reportError Diese Funktion wird aufgerufen, wenn die geladene
                           DLL eine Funktion nicht unterstützt. Übergeben wird
                           der Name der Funktion  */

     int
    dsLoadDll( void(*reportError)( const char*) )
    {
      assert( NULL != reportError);

       HANDLE
      dll( (LoadLibrary(&quot;dayseconds.dll&quot;)));

      if(!dll) return 1;

      //Code zum Laden der Funktionen
      DAYSECONDS_LOAD_FUN( foo, &quot;_foo&quot;);
      return 0;
    }
  #endif
#endif

#endif //include-Wächter
</code></pre>
<p>Zugehöriger Export (DLL-Seite)</p>
<pre><code class="language-cpp">//MY_DLLNAME_EXPORT muss gesetzt sein
#include &quot;myDll&quot;

extern &quot;C&quot;
{
  DAYSECONDS_DLL_FUNCTION_DECLARATION
  (  DAYSECONDS_QUALIFIER,             
     int,                               
    foo)( const long bar)               
    {
      //whatever
      return 0;
    }
}
</code></pre>
<p>zugehöriger dynamischer Import (Client-Seite)</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

//MY_DLLNAME_DYNAMIC_IMPORT_DECLARATION muss gesetzt sein
#define MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION
#include &quot;myDll.h&quot;
//BEACHTE: myDll.h genau EIN einziges mal mit
//         dem Define MY_DLLNAME_DYNAMIC_IMPORT_DEFINITION
//         importieren

 namespace
client
{
   void
  notLoadable( const char* msg)
  {
    std::cerr &lt;&lt; &quot;Funktion '&quot;&lt;&lt;msg&lt;&lt;&quot;' konnte nicht aus der daySeconds.dll geladen werden.\n&quot;&lt;&lt;;
  };

  /** Lädt die dll &quot;MyDLL&quot; dynamisch.*/
   void
  loadMyDll()
  {
     static
     bool
    loaded(false);  //es wird nur einmal geladen

    if(!loaded)
    {
      if (dsLoadDll( notLoadable))
      {
         std::cerr &lt;&lt; &quot;daySeconds.dll konnte nicht geladen werden&quot;;
      }
    }
  }

   void
  doSomething()
  {
    //...
     int
    foosValue( foo(13));  //Aufruf der DLL-Funktion
  }
} //clent
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/474198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/474198</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Mon, 08 Mar 2004 08:45:28 GMT</pubDate></item><item><title><![CDATA[Reply to dll exportieren, statisch importieren, dynamisch importieren on Sat, 06 Mar 2004 15:39:51 GMT]]></title><description><![CDATA[<p>kartoffelsack schrieb:</p>
<blockquote>
<p>Hier mal ein ungefragter Vorschlag,</p>
</blockquote>
<p>Dann sag ich mal, ebenfalls ungefragt, daß VC User selbstverständlich ebenfalls __stdcall ex- und importieren sollen und nicht __cdecl. Und die, die noch etwas anderes benutzen, sollen auch __stdcall verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/474497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/474497</guid><dc:creator><![CDATA[-King-]]></dc:creator><pubDate>Sat, 06 Mar 2004 15:39:51 GMT</pubDate></item></channel></rss>