/**************/ /* dllmain.cpp*/ /**************************************************************************** MODULE: dllmain.cpp PURPOSE: Pääohjelma yksinkertaisille DLL-kirjastoille AUTHOR: Vesa Lappalainen 29.8.1994 & 20.11.1996 (OWL-versio) UPADTE: USAGE: 1) Projektiin mukaan (korvaa oma_ haluamallasi nimellä) oma_lib.c [oma_lib.rc] oma_dll.def - katso malli myöhemmin alla ALI\owl\dllmain.cpp Määrittele käännöksessä vakio _OWLDLL 2) Tulos nimelle oma_dll.dll (muista tulos .DLL) 3) Käännöksen jälkeen vielä kirjaston tekeminen: IMPLIB oma_dll.lib oma_dll.dll 4) Kirjastoa käytettäessä liitetään projektiin oma_dll.lib. 5) Tiedoston oma_lib.h alkuun #include "dllmain.h". 6) Omat aliohjelmat (oma_lib.c) kirjoitetaan muodossa: int WINAPI_LIB karkausvuosi(int vuosi); Kaikki osoitteet on syytä määrittää pitkiksi, käyttäen LPSTR ja vastaavia tyyppejä. WINAPI_LIB on joko WINAPI _export tai WINAPI sen mukaan onko kyseessä DLL-käännös vai ei. Näin samaa tiedostoa voidaan käyttää sekä DLL-kirjaston osana, että tavallisen kirjaston osana. Tässä pääohjelmassa on valmiina globaali muuttuja DLL_G_hInstance, joka sisältää DLL-kirjastom esiintymän kahvan. Tätä tarvitaan, mikäli esim. joitakin resursseja halutaan käyttöön. OWL:ää varten on DLL_G_ResMod, joka on valmiiksi luotu osoitin TModule -tyyppisen olioon. ----------------------------------------------------------------------------- DLL-kirjaston erot tavalliseen ohjelmaan: ========================================= DLL-kirjaston tekemiseksi pitää muistaa kääntää se ensinnäkin DLL:ksi (Borland C++ 3.1: Options-Application-Windows DLL) (Borland C++ 4.0: Project-New-Target Type- .dll) DLL:än .DEF-tiedostossa ei ole NAME, vaan LIBRARY (OMA_DLL.DEF): LIBRARY OMA_DLL ; Kirjaston DLL nimi. DESCRIPTION 'Omat aliohjelmat' EXETYPE WINDOWS ; PROTMODE CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE SINGLE ; HUOM! SINGLE "Pääohjelmana" ei ole WinMain, vaan WinLib 16-bit ja DllEntryPoint 32-bit "Lopetusohjelmana" on WEP 16-bit ja DllEntryPoint 32-bit "Globaalien" muuttujien kanssa on oltava tarkkana ja käyttömuuttujista on tehtävä oma versio jokaiselle käynnissä olevalle kutsulle! Muuten DLL-aliohjelmat tehdään kuin mitkä tahansa aliohjelmat. ****************************************************************************/ #include #include "owl\dllmain.h" HINSTANCE DLL_G_hInstance; /* Globaalit muuttujat, joita mahd.tarvitaan. */ TModule *DLL_G_ResMod; /***************************************************************************/ /* Siirrettävyys-aliohjelmat, jotta asioita ei tarvitse kirjoittaa moneen */ /* paikkaan Win 3.1:stä ja Win32:sta varten erikseen. */ /***************************************************************************/ static int DLL_lib_init(HINSTANCE hInstance) { DLL_G_hInstance = hInstance; if ( !DLL_G_ResMod ) DLL_G_ResMod = new TModule(0,hInstance); return 1; } /***************************************************************************/ static int DLL_lib_end(void) { return 1; } /***************************************************************************/ /*16*16*16*16*16*16*16*16*16*16*16*16*16*16*16*16*16*16*16*16*16*16*16*16***/ #ifndef __WIN32__ int WINAPI _export WEP(int bSystemExit) { #pragma argsused return DLL_lib_end(); } int WINAPI LibMain(HINSTANCE hInstance, WORD wDataSeg, WORD wHeapSize, LPSTR lpCmdLine) { #pragma argsused if ( wHeapSize > 0 ) UnlockData(0); return DLL_lib_init(hInstance); } /***************************************************************************/ /*32*32*32*32*32*32*32*32*32*32*32*32*32*32*32*32*32*32*32*32*32*32*32*32***/ #else /* 32-bit */ BOOL WINAPI DllEntryPoint(HINSTANCE hinstDll,DWORD fdwReason,LPVOID plvReserved) { #pragma argsused /* fdwReason = 0 lopetuksessa ja 1 aloituksessa */ static int initialized = 0; switch( fdwReason ) { case DLL_THREAD_DETACH : case DLL_PROCESS_ATTACH: if ( !initialized ) { initialized = 1; return DLL_lib_init(hinstDll); } case DLL_PROCESS_DETACH: initialized = 0; return DLL_lib_end(); } return 1; } #endif /* 32-bit */