Artifact 6b2f129d530b6aee348c6479c2ea49e86c9a579d
- File
src/windll.d
-
2015-05-05 06:49:05
- part of checkin
[9b639cf2d6]
on branch trunk
- Working version for update to 2.067.
The problem was __gshared. Replacing it with TLS fixed the issue. Remaining problem is that "hack.d"'s CloseHandle hack is not working anymore.
(user: kinaba) [annotate]
-
2015-05-05 06:49:05
- part of checkin
[9b639cf2d6]
on branch trunk
- Working version for update to 2.067.
import core.runtime;
import win32.windows;
import std.string;
class WinDLLException : Exception
{
private this( string msg ) { super(msg); }
}
class WinDLL
{
// constructor:
// Load a DLL of specified name.
// Avoid loading the DLL from the current directory for security.
this( string dllname )
{
char original_cur[MAX_PATH];
char sys[MAX_PATH];
GetCurrentDirectoryA(original_cur.length, original_cur.ptr);
GetSystemDirectoryA(sys.ptr, sys.length);
SetCurrentDirectoryA(sys.ptr);
handle = cast(HINSTANCE) Runtime.loadLibrary(dllname);
SetCurrentDirectoryA(original_cur.ptr);
if( handle is null )
throw new WinDLLException( dllname ~ " not found" );
}
static WinDLL load( string name )
{
try {
return new WinDLL(name);
} catch(WinDLLException e) { return null; }
}
// close:
// free the DLL
void close()
{
if( handle )
{
Runtime.unloadLibrary(handle);
handle = null;
}
}
// get_api:
// extract a function with specified name from the DLL.
// may return null.
template get_api(FnT)
{
FnT get_api( string apiname )
in { assert(handle); }
body
{
return cast(FnT) GetProcAddress( handle, apiname.toStringz() );
}
}
// load_resource:
// extract a resource
void* load_resource( string resname, const char* type )
in { assert(handle); }
body
{
if(resname in rsrc_map)
return rsrc_map[resname];
HRSRC hi = FindResource( handle, resname.toStringz(), type );
if( hi is null )
return null;
HGLOBAL hr = LoadResource( handle, hi );
if( hr is null )
return null;
void* v = LockResource( hr );
rsrc_map[resname] = v;
return v;
}
// load_diaglog:
// specialized version of load_resource
void* load_dialog( string resname )
{
return load_resource( resname, RT_DIALOG );
}
private HINSTANCE handle;
private void*[string] rsrc_map;
}