/**************/ /* pvmdll.c */ /**************************************************************************** MODULE: pvmdll.c PURPOSE: Esimerkki yksinkertaisesta DLL-kirjastosta. AUTHOR: Vesa Lappalainen 28.8.1994 UPADTE: USAGE: Kirjaston käyttämiseksi 1) Lisätään omaan ohjelmaan #include "pvmlib.h" 2) Kutsut aliohjelmiin: if ( karkausvuosi(1994) ) ... 3) Lisätään omaan .DEF -tiedostoon IMPORTS PVMDLL.karkausvuosi tai lisätään projektiin .LIB, johon tarvittavat .DLLät on lisätty 4) Varmistetaan, että ajonaikana PVMDLL.DLL on joko oletushakemistossa tai polussa. PS. Tämä tiedoston pääohjelma toimii melkein sellaisenaan minkä tahansa DLL:än "pääohjelmana". ****************************************************************************/ #include #include #include "pvmlib.h" /****************************************************************************/ int WINAPI _export karkausvuosi(int vuosi) { if ( vuosi % 100 ) return ( vuosi % 4 ) == 0; return ( vuosi % 400 ) == 0; } /***************************************************************************** Tämän kirjaston kääntämiseksi pitää projektissa olla PVMDLL.C PVMDLL.DEF ----------------------------------------------------------------------------- DLL-kirjaston erot tavalliseen ohjelmaan: ========================================= DLL-kirjaston tekemiseksi pitää muistaa kääntää se ensinnäkin DLL:ksi (Borland C++: Options-Application-Windows DLL) DLL:än .DEF-tiedostossa ei ole NAME, vaan LIBRARY (PVMDLL.DEF): LIBRARY PVMDLL ; application's module name DESCRIPTION 'Tekee päivämäärähommia' EXETYPE WINDOWS ; required for all Windows applications 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 tehdään kuin mikä tahansa ohjelma. Jos DLL-halutaan lisätä kirjastoon (.LIB), käytetään vaikkapa ohjelmaa ImpLib. IMPLIB pvmdll.lib pvmdll.dll ****************************************************************************/ 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 */