Shared Library: Why doesn't this work?

torhu no at spam.invalid
Sat Sep 27 00:33:44 PDT 2008


Benji Smith wrote:
> I'm trying to read the total amount of memory on a Windows system (using 
> D 1.35 and Tango 0.99.7 on WinXP SP3) using tango.sys.SharedLib to load 
> kerner32.dll.
> 
> Here's the code...
> 
> ---------------------------------------------------------------------
> module SystemMemoryTest;
> 
> import tango.io.Stdout;
> import tango.sys.SharedLib;
> 
> alias uint DWORD;
> alias ulong DWORDLONG;
> 
> struct MEMORYSTATUSEX
> {
>     DWORD dwLength;
>     DWORD dwMemoryLoad;
>     DWORDLONG ullTotalPhys;
>     DWORDLONG ullAvailPhys;
>     DWORDLONG ullTotalPageFile;
>     DWORDLONG ullAvailPageFile;
>     DWORDLONG ullTotalVirtual;
>     DWORDLONG ullAvailVirtual;
>     DWORDLONG ullAvailExtendedVirtual;
> }
> 
> typedef void function(MEMORYSTATUSEX*) func_type;
> func_type myFunction;
> 
> void main() {
> 
>     if (auto lib = SharedLib.load(`c:\windows\system32\kernel32.dll`)) {
>        Stdout("Loaded library").newline;
> 
>        if (void* symbolAddress = lib.getSymbol("GlobalMemoryStatusEx")) {
>           Stdout.formatln("Found symbol at 0x{:x}", symbolAddress);
> 
>           void** pMyFunction = cast(void**) &myFunction;
>           *pMyFunction = symbolAddress;
> 
>           MEMORYSTATUSEX mem;
>           myFunction(&mem);
> 
>           Stdout.formatln("total physical mem: {0}", mem.ullTotalPhys);
>           Stdout.formatln("avail physical mem: {0}", mem.ullAvailPhys);
>        }
>        lib.unload();
>     }
> }
> ---------------------------------------------------------------------

Here's one that works, important changes marked with XXX :)

----
module SystemMemoryTest;

import tango.io.Stdout;
import tango.sys.SharedLib;

alias uint DWORD;
alias ulong DWORDLONG;

struct MEMORYSTATUSEX
{
     DWORD dwLength;
     DWORD dwMemoryLoad;
     DWORDLONG ullTotalPhys;
     DWORDLONG ullAvailPhys;
     DWORDLONG ullTotalPageFile;
     DWORDLONG ullAvailPageFile;
     DWORDLONG ullTotalVirtual;
     DWORDLONG ullAvailVirtual;
     DWORDLONG ullAvailExtendedVirtual;
}

// XXX: need to be stdcall, ie. extern (Windows)
extern (Windows) typedef void function(MEMORYSTATUSEX*) func_type;

void main() {

     if (auto lib = SharedLib.load(`c:\windows\system32\kernel32.dll`)) {
        Stdout("Loaded library").newline;

        if (auto myFunction = 
cast(func_type)lib.getSymbol("GlobalMemoryStatusEx")) {
           Stdout.formatln("Found symbol at 0x{:x}", myFunction);

           MEMORYSTATUSEX mem;
           mem.dwLength = mem.sizeof;  // XXX
           myFunction(&mem);

           Stdout.formatln("total physical mem: {0}", mem.ullTotalPhys);
           Stdout.formatln("avail physical mem: {0}", mem.ullAvailPhys);
        }
        lib.unload();
     }
}
----


More information about the Digitalmars-d-learn mailing list