File Annotation

Not logged in
9b639cf2d6 2015-05-05        kinaba: import core.runtime;
9b639cf2d6 2015-05-05        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:
9b639cf2d6 2015-05-05        kinaba: 	//   Load a DLL of specified name.
9b639cf2d6 2015-05-05        kinaba: 	//   Avoid loading the DLL from the current directory for security.
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];
9b639cf2d6 2015-05-05        kinaba: 		GetCurrentDirectoryA(original_cur.length, original_cur.ptr);
9b639cf2d6 2015-05-05        kinaba: 		GetSystemDirectoryA(sys.ptr, sys.length);
4e2933c620 2015-04-21        kinaba: 		SetCurrentDirectoryA(sys.ptr);
9b639cf2d6 2015-05-05        kinaba: 		handle = cast(HINSTANCE) Runtime.loadLibrary(dllname);
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: 		{
9b639cf2d6 2015-05-05        kinaba: 			Runtime.unloadLibrary(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: 
9b639cf2d6 2015-05-05        kinaba: 	void* load_resource( string resname, const char* type )
c2b7a98c21 2011-02-23        kinaba: 		in { assert(handle); }
c2b7a98c21 2011-02-23        kinaba: 		body
c2b7a98c21 2011-02-23        kinaba: 		{
9b639cf2d6 2015-05-05        kinaba: 			if(resname in rsrc_map)
9b639cf2d6 2015-05-05        kinaba: 				return rsrc_map[resname];
9b639cf2d6 2015-05-05        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;
9b639cf2d6 2015-05-05        kinaba: 			void* v = LockResource( hr );
9b639cf2d6 2015-05-05        kinaba: 			rsrc_map[resname] = v;
9b639cf2d6 2015-05-05        kinaba: 			return v;
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;
9b639cf2d6 2015-05-05        kinaba: 	private void*[string] rsrc_map;
c2b7a98c21 2011-02-23        kinaba: }