c2b7a98c21 2011-02-23 kinaba: private import win32.ansi.windows; c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: class WinDLLException : Exception c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: private this( char[] msg ) { super(msg); } c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: class WinDLL c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: // constructor: c2b7a98c21 2011-02-23 kinaba: // Load a DLL with specified name c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: this( char[] dllname ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: char original_cur[MAX_PATH]; c2b7a98c21 2011-02-23 kinaba: char sys[MAX_PATH]; c2b7a98c21 2011-02-23 kinaba: GetCurrentDirectory(MAX_PATH, original_cur); c2b7a98c21 2011-02-23 kinaba: GetSystemDirectory(sys, MAX_PATH); c2b7a98c21 2011-02-23 kinaba: SetCurrentDirectory(sys); c2b7a98c21 2011-02-23 kinaba: handle = LoadLibrary( dllname ); c2b7a98c21 2011-02-23 kinaba: SetCurrentDirectory(original_cur); c2b7a98c21 2011-02-23 kinaba: if( handle is null ) c2b7a98c21 2011-02-23 kinaba: throw new WinDLLException( dllname ~ " not found" ); c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: static WinDLL load( char[] name ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: try { c2b7a98c21 2011-02-23 kinaba: return new WinDLL(name); c2b7a98c21 2011-02-23 kinaba: } catch(WinDLLException e) { return null; } c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: // close: c2b7a98c21 2011-02-23 kinaba: // free the DLL c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: void close() c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: if( handle ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: FreeLibrary( handle ); c2b7a98c21 2011-02-23 kinaba: handle = null; c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: // get_api: c2b7a98c21 2011-02-23 kinaba: // extract a function with specified name from the DLL. c2b7a98c21 2011-02-23 kinaba: // may return null. c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: template get_api(FnT) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: FnT get_api( char[] apiname ) c2b7a98c21 2011-02-23 kinaba: in { assert(handle); } c2b7a98c21 2011-02-23 kinaba: body c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: return cast(FnT) GetProcAddress( handle, apiname ); c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: // load_resource: c2b7a98c21 2011-02-23 kinaba: // extract a resource c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: void* load_resource( char[] resname, char* type ) c2b7a98c21 2011-02-23 kinaba: in { assert(handle); } c2b7a98c21 2011-02-23 kinaba: body c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: HRSRC hi = FindResource( handle, resname, type ); c2b7a98c21 2011-02-23 kinaba: if( hi is null ) c2b7a98c21 2011-02-23 kinaba: return null; c2b7a98c21 2011-02-23 kinaba: HGLOBAL hr = LoadResource( handle, hi ); c2b7a98c21 2011-02-23 kinaba: if( hr is null ) c2b7a98c21 2011-02-23 kinaba: return null; c2b7a98c21 2011-02-23 kinaba: return LockResource( hr ); c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: // load_diaglog: c2b7a98c21 2011-02-23 kinaba: // specialized version of load_resource c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: void* load_dialog( char[] resname ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: return load_resource( resname, RT_DIALOG ); c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: private HINSTANCE handle; c2b7a98c21 2011-02-23 kinaba: }