ab3b073ef6 2015-04-30 kinaba: import win32.windows; ab3b073ef6 2015-04-30 kinaba: import std.string; c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: class WinDLLException : Exception c2b7a98c21 2011-02-23 kinaba: { 4e2933c620 2015-04-21 kinaba: private this( string 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: 4e2933c620 2015-04-21 kinaba: this( string 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]; 4e2933c620 2015-04-21 kinaba: GetCurrentDirectoryA(MAX_PATH, original_cur.ptr); 4e2933c620 2015-04-21 kinaba: GetSystemDirectoryA(sys.ptr, MAX_PATH); 4e2933c620 2015-04-21 kinaba: SetCurrentDirectoryA(sys.ptr); 4e2933c620 2015-04-21 kinaba: handle = LoadLibraryA( dllname.ptr ); 4e2933c620 2015-04-21 kinaba: SetCurrentDirectoryA(original_cur.ptr); 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: 4e2933c620 2015-04-21 kinaba: static WinDLL load( string 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: { 4e2933c620 2015-04-21 kinaba: FnT get_api( string apiname ) c2b7a98c21 2011-02-23 kinaba: in { assert(handle); } c2b7a98c21 2011-02-23 kinaba: body c2b7a98c21 2011-02-23 kinaba: { 4e2933c620 2015-04-21 kinaba: return cast(FnT) GetProcAddress( handle, apiname.toStringz() ); 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: 4e2933c620 2015-04-21 kinaba: void* load_resource( string resname, char* type ) c2b7a98c21 2011-02-23 kinaba: in { assert(handle); } c2b7a98c21 2011-02-23 kinaba: body c2b7a98c21 2011-02-23 kinaba: { 4e2933c620 2015-04-21 kinaba: HRSRC hi = FindResource( handle, resname.toStringz(), 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: 4e2933c620 2015-04-21 kinaba: void* load_dialog( string 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: }