Differences From Artifact [bbb6d5827e2268a2]:
- File        
src/windll.d
- 2015-04-30 23:29:51 - part of checkin [ab3b073ef6] on branch trunk - private import => import (since in the latest D it is the default.) (user: kinaba) [annotate]
 
To Artifact [6b2f129d530b6aee]:
- 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.
                                                                                        >     1  import core.runtime;
    1  import win32.windows;                                                           |     2  import win32.windows;
    2  import std.string;                                                                     3  import std.string;
    3                                                                                         4  
    4  class WinDLLException : Exception                                                      5  class WinDLLException : Exception
    5  {                                                                                      6  {
    6          private this( string msg ) { super(msg); }                                     7          private this( string msg ) { super(msg); }
    7  }                                                                                      8  }
    8                                                                                         9  
    9  class WinDLL                                                                          10  class WinDLL
   10  {                                                                                     11  {
   11          // constructor:                                                               12          // constructor:
   12          //   Load a DLL with specified name                                      |    13          //   Load a DLL of specified name.
                                                                                        >    14          //   Avoid loading the DLL from the current directory for security.
   13                                                                                        15  
   14          this( string dllname )                                                        16          this( string dllname )
   15          {                                                                             17          {
   16                  char original_cur[MAX_PATH];                                          18                  char original_cur[MAX_PATH];
   17                  char sys[MAX_PATH];                                                   19                  char sys[MAX_PATH];
   18                  GetCurrentDirectoryA(MAX_PATH, original_cur.ptr);                |    20                  GetCurrentDirectoryA(original_cur.length, original_cur.ptr);
   19                  GetSystemDirectoryA(sys.ptr, MAX_PATH);                          |    21                  GetSystemDirectoryA(sys.ptr, sys.length);
   20                  SetCurrentDirectoryA(sys.ptr);                                        22                  SetCurrentDirectoryA(sys.ptr);
   21                  handle = LoadLibraryA( dllname.ptr );                            |    23                  handle = cast(HINSTANCE) Runtime.loadLibrary(dllname);
   22                  SetCurrentDirectoryA(original_cur.ptr);                               24                  SetCurrentDirectoryA(original_cur.ptr);
   23                  if( handle is null )                                                  25                  if( handle is null )
   24                          throw new WinDLLException( dllname ~ " not found" );          26                          throw new WinDLLException( dllname ~ " not found" );
   25          }                                                                             27          }
   26                                                                                        28  
   27          static WinDLL load( string name )                                             29          static WinDLL load( string name )
   28          {                                                                             30          {
................................................................................................................................................................................
   34          // close:                                                                     36          // close:
   35          //   free the DLL                                                             37          //   free the DLL
   36                                                                                        38  
   37          void close()                                                                  39          void close()
   38          {                                                                             40          {
   39                  if( handle )                                                          41                  if( handle )
   40                  {                                                                     42                  {
   41                          FreeLibrary( handle );                                   |    43                          Runtime.unloadLibrary(handle);
   42                          handle = null;                                                44                          handle = null;
   43                  }                                                                     45                  }
   44          }                                                                             46          }
   45                                                                                        47  
   46          // get_api:                                                                   48          // get_api:
   47          //   extract a function with specified name from the DLL.                     49          //   extract a function with specified name from the DLL.
   48          //   may return null.                                                         50          //   may return null.
................................................................................................................................................................................
   56                                  return cast(FnT) GetProcAddress( handle, apiname      58                                  return cast(FnT) GetProcAddress( handle, apiname
   57                          }                                                             59                          }
   58          }                                                                             60          }
   59                                                                                        61  
   60          // load_resource:                                                             62          // load_resource:
   61          //   extract a resource                                                       63          //   extract a resource
   62                                                                                        64  
   63          void* load_resource( string resname, char* type )                        |    65          void* load_resource( string resname, const char* type )
   64                  in { assert(handle); }                                                66                  in { assert(handle); }
   65                  body                                                                  67                  body
   66                  {                                                                     68                  {
                                                                                        >    69                          if(resname in rsrc_map)
                                                                                        >    70                                  return rsrc_map[resname];
                                                                                        >    71  
   67                          HRSRC hi = FindResource( handle, resname.toStringz(), ty      72                          HRSRC hi = FindResource( handle, resname.toStringz(), ty
   68                          if( hi is null )                                              73                          if( hi is null )
   69                                  return null;                                          74                                  return null;
   70                          HGLOBAL hr = LoadResource( handle, hi );                      75                          HGLOBAL hr = LoadResource( handle, hi );
   71                          if( hr is null )                                              76                          if( hr is null )
   72                                  return null;                                          77                                  return null;
   73                          return LockResource( hr );                               |    78                          void* v = LockResource( hr );
                                                                                        >    79                          rsrc_map[resname] = v;
                                                                                        >    80                          return v;
   74                  }                                                                     81                  }
   75                                                                                        82  
   76          // load_diaglog:                                                              83          // load_diaglog:
   77          //   specialized version of load_resource                                     84          //   specialized version of load_resource
   78                                                                                        85  
   79          void* load_dialog( string resname )                                           86          void* load_dialog( string resname )
   80          {                                                                             87          {
   81                  return load_resource( resname, RT_DIALOG );                           88                  return load_resource( resname, RT_DIALOG );
   82          }                                                                             89          }
   83                                                                                        90  
   84          private HINSTANCE handle;                                                     91          private HINSTANCE handle;
                                                                                        >    92          private void*[string] rsrc_map;
   85  }                                                                                     93  }