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