🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #465

Re: Einbinden von DLL-s?

#465
From: EYCK
Date: Sun, 24 Sep 1995 19:17
127 lines
4294 bytes
-----BEGIN PGP SIGNED MESSAGE-----

Hallo Leute,

meinte am 21.09.95
zum Thema "Einbinden von DLL-s?":

j>wie kann ich in meinem Programm mir unbekannte dll's einbinden, die
j>natuerlich eine bekannte Schnittstelle bieten. Ich erkenne die DLL
j>nur an der Endung, z.b. *.flt fuer eine Filter dll. Was fuer einen
j>Filter die DLL darstellt kann man abfragen, doch wie kann ich dann
j>mir unbekannte DLL's (z.B. von anderen Autoren gesschrieben) in
j>meinem Programm automatisch einbinden und ansprechen?

Ich denke, Du meinst dass jetzt unter Windows? Wenn nicht, kannste  
alles ueberlesen, was jetzt kommt... :-)

Zunaechst setze ich mal voraus, dass Du einen  
Schnittstellenbeschreibung der von Dir zu benutzenden DLLs hast. Ohne  
wird es wohl zeimlich schwierig werden, da man zB keine Ahnung ueber  
die Parametresierung der Funktionen hat.

Dann gibt es prinzipiell 2 Moeglichkeiten:

Fuer die DLL steht eine sog. Import-Lib zur Verfuegung (*.LIB), die Du  
einfach nur zu Deinem Programm dazulinken musst. Diese Lib sorgt beim  
Starten des Programmes automatisch dafuer, dass die DLL nachgeladen  
wird und die Funktionen zur Verfuegung stehen.

Andere Moeglichkeit: Du laedst die DLL explizit selber ueber  
LoadLibrary(...) und ermittelst anhand der Funktionsnamen oder  
Ordinalzahlen der Funktionen in der DLL die Einsprungpunkte in der DLL  
(-> Funktionspointer). Ueber diese Pointer kannst Du dann die  
Funktionen aufrufen. Nachher gibst Du die DLL mit FreeLibrary(...)  
wieder frei.

Kleines Bsp. (gekuerzt) fuer die MAPI.DLL:

- -------------------- Zeile hier abknabbern --------------------

#include <windows.h>

[...]

///////////////////////////////////////////////////////////////////////////////
// Konstanten der Funktionsnamen aus der DLL

static const char *SZ_MAPILOGON       = "MAPILogon";
static const char *SZ_MAPILOGOFF      = "MAPILogoff";

[...]


///////////////////////////////////////////////////////////////////////////////
// Lokale Variablen

static HANDLE hMapiDLL = NULL; // Handle der MAPI.DLL


///////////////////////////////////////////////////////////////////////////////
// Funktionen, die die DLL zur Verf³gung stellt (³ber Zeiger)

// Castingtypen, damit GetProcAddress() nicht dauernd angemeckert wird (C++!)

typedef ULONG (FAR PASCAL *tMAPILogon)
              (ULONG, LPSTR, LPSTR, FLAGS, ULONG, LPLHANDLE);

typedef ULONG (FAR PASCAL *tMAPILogoff)
              (LHANDLE, ULONG, FLAGS,ULONG);

[...]

tMAPILogon          lpfnMAPILogon;
tMAPILogoff         lpfnMAPILogoff;

[...]

///////////////////////////////////////////////////////////////////////////////
// Implementation

tMapiError FAR PASCAL InitMAPI(void)
{
    if ((hMapiDLL = LoadLibrary(MAPIDLL)) < 32)
        return(MAPIERR_LOAD_LIB);

    if ((lpfnMAPILogon = (tMAPILogon)
                         GetProcAddress(hMapiDLL, SZ_MAPILOGON)) == NULL)
        return(MAPIERR_LOAD_FUNC);

    if ((lpfnMAPILogoff = (tMAPILogoff)
                          GetProcAddress(hMapiDLL, SZ_MAPILOGOFF)) == NULL)
        return(MAPIERR_LOAD_FUNC);

[...]

  return(MAPIERR_OK);
}


tMapiError FAR PASCAL DeInitMAPI(void)
{
    lpfnMAPILogon         = NULL;
    lpfnMAPILogoff        = NULL;

[...]

    FreeLibrary(hMapiDLL);
    hMapiDLL = NULL;
    return(MAPIERR_OK);
}

- -------------------- Zeile hier abknabbern --------------------


-----BEGIN PGP SIGNATURE-----
Version: 2.6.2i

iQCVAwUBMGW82QR6oxcESAGtAQHvmwP/RcaFWOiFaH81ytVNu9Qbac+sJ9RSztJX
rjA23WM+eJ2hJIeJJ0oZxj7lCx4WZpsL0K2pCfCshY2wvmI05QNauUPk3NvlffFO
9q4oKl0rFxWWdB5SyZFJfCDI5/t9pvRCuSFjEx+mJJzp82gyuVJqGeHY6o9IqJ2Q
pR1HAB3pDjE=
=3c2b
-----END PGP SIGNATURE-----
  
  
Viele Gruesse
     Eyck.
Technical Details
Message-ID: <5uSgQgf_KqB@p012.mbbs.imk.org>
Path: arc1-ca.pugleaf.net!mbbs.dinoco.de!EYCK
References: <43rg3v$19c@brachio.zrz.TU-Berlin.DE>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!mbbs.dinoco.de!EYCK
From: EYCK@mbbs.dinoco.de
Newsgroups: de.comp.lang.c++
Subject: Re: Einbinden von DLL-s?
Date: 24 Sep 95 20:17:00 +0100
Message-ID: <5uSgQgf_KqB@p012.mbbs.imk.org>
References: <43rg3v$19c@brachio.zrz.TU-Berlin.DE>
X-Mailer: CrossPoint v3.02 R/A2701 - ZCFido v0.25a via [DOS/NCBMail V2.11c REL.:130595]
X-Gateway: ZCONNECT UH mbbs.dinoco.de [UUCPfZ V5.60 U027]
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit