/**************/ /* dllmain.c */ /**************************************************************************** MODULE: dllmain.c PURPOSE: Pääohjelma yksinkertaisille DLL-kirjastoille AUTHOR: Vesa Lappalainen 29.8.1994 UPADTE: USAGE: 1) Projektiin mukaan (korvaa oma_ haluamallasi nimellä) oma_lib.c [oma_lib.rc] oma_dll.def - katso malli myöhemmin alla ALI\dllmain.c 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. ----------------------------------------------------------------------------- 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 HEAPSIZE 1024 "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 "dllmain.h" HINSTANCE DLL_G_hInstance; /* Globaalit muuttujat, joita mahd.tarvitaan. */ /***************************************************************************/ /* 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; 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 */ switch( fdwReason ) { case 1: return DLL_lib_init(hinstDll); case 0: return DLL_lib_end(); } return 1; } #endif /* 32-bit */