Trouble with DLL address
I have a DLL which exports a function GetFunction. GetFunction returns a pointer to RealFunction. Now I want to run RealFunction from my D program, but for some reason I get the wrong address. Here is the code. dll64.c - #define WIN32_LEAN_AND_MEAN #include windows.h int __stdcall RealFunction(int a) { return a + 1; } typedef int (__stdcall *FuncPtr)(int); FuncPtr __stdcall GetFunction() { return RealFunction; } mydll64.def LIBRARY mydll64.dll EXPORTS GetFunction - build with MSVC64: cl -c dll64.c -Fomydll64.obj link /DLL /OUT:mydll64.dll mydll64.obj /DEF:mydll64.def And this is the D program. testdll64d.d // dmd -m64 -c testdll64d.d -oftestdll64d.obj // link /OUT:testdll64d.exe testdll64d.obj import core.runtime; import std.c.windows.windows; import std.stdio; alias extern(Windows) int function(int) FuncPtr; int main(string[] args) { HMODULE dll = LoadLibraryA(mydll64.DLL); FARPROC getFunction = GetProcAddress(dll, GetFunction); FuncPtr realFunction = cast(FuncPtr) getFunction(); writefln(dll address: %08x, dll); writefln(GetFunction address: %08x, getFunction); writefln(RealFunction address: %08x, realFunction); writefln(RealFunction result: %d, realFunction(7));//-- CRASH return 0; } -- Output: dll address: 18000 GetFunction address: 180001020 RealFunction address: 80001000 CRASH BTW, this works: FuncPtr realFunction = cast(FuncPtr) (getFunction() 0x | cast(size_t) dll);
Re: Trouble with DLL address
Just ignore my post - too early in the morning :( Am 14.01.2013 10:19, schrieb dennis luehring: http://dlang.org/type.html int = signed 32 bits but don't you need long in D Am 14.01.2013 10:13, schrieb dnewbie: I have a DLL which exports a function GetFunction. GetFunction returns a pointer to RealFunction. Now I want to run RealFunction from my D program, but for some reason I get the wrong address. Here is the code. dll64.c - #define WIN32_LEAN_AND_MEAN #include windows.h int __stdcall RealFunction(int a) { return a + 1; } typedef int (__stdcall *FuncPtr)(int); FuncPtr __stdcall GetFunction() { return RealFunction; } mydll64.def LIBRARY mydll64.dll EXPORTS GetFunction - build with MSVC64: cl -c dll64.c -Fomydll64.obj link /DLL /OUT:mydll64.dll mydll64.obj /DEF:mydll64.def And this is the D program. testdll64d.d // dmd -m64 -c testdll64d.d -oftestdll64d.obj // link /OUT:testdll64d.exe testdll64d.obj import core.runtime; import std.c.windows.windows; import std.stdio; alias extern(Windows) int function(int) FuncPtr; int main(string[] args) { HMODULE dll = LoadLibraryA(mydll64.DLL); FARPROC getFunction = GetProcAddress(dll, GetFunction); FuncPtr realFunction = cast(FuncPtr) getFunction(); writefln(dll address: %08x, dll); writefln(GetFunction address: %08x, getFunction); writefln(RealFunction address: %08x, realFunction); writefln(RealFunction result: %d, realFunction(7));//-- CRASH return 0; } -- Output: dll address: 18000 GetFunction address: 180001020 RealFunction address: 80001000 CRASH BTW, this works: FuncPtr realFunction = cast(FuncPtr) (getFunction() 0x | cast(size_t) dll);
Re: Trouble with DLL address
http://dlang.org/type.html int = signed 32 bits but don't you need long in D Am 14.01.2013 10:13, schrieb dnewbie: I have a DLL which exports a function GetFunction. GetFunction returns a pointer to RealFunction. Now I want to run RealFunction from my D program, but for some reason I get the wrong address. Here is the code. dll64.c - #define WIN32_LEAN_AND_MEAN #include windows.h int __stdcall RealFunction(int a) { return a + 1; } typedef int (__stdcall *FuncPtr)(int); FuncPtr __stdcall GetFunction() { return RealFunction; } mydll64.def LIBRARY mydll64.dll EXPORTS GetFunction - build with MSVC64: cl -c dll64.c -Fomydll64.obj link /DLL /OUT:mydll64.dll mydll64.obj /DEF:mydll64.def And this is the D program. testdll64d.d // dmd -m64 -c testdll64d.d -oftestdll64d.obj // link /OUT:testdll64d.exe testdll64d.obj import core.runtime; import std.c.windows.windows; import std.stdio; alias extern(Windows) int function(int) FuncPtr; int main(string[] args) { HMODULE dll = LoadLibraryA(mydll64.DLL); FARPROC getFunction = GetProcAddress(dll, GetFunction); FuncPtr realFunction = cast(FuncPtr) getFunction(); writefln(dll address: %08x, dll); writefln(GetFunction address: %08x, getFunction); writefln(RealFunction address: %08x, realFunction); writefln(RealFunction result: %d, realFunction(7));//-- CRASH return 0; } -- Output: dll address: 18000 GetFunction address: 180001020 RealFunction address: 80001000 CRASH BTW, this works: FuncPtr realFunction = cast(FuncPtr) (getFunction() 0x | cast(size_t) dll);
Re: Trouble with DLL address
On 1/14/13, dnewbie r...@myopera.com wrote: FuncPtr realFunction = cast(FuncPtr) getFunction(); Make that: FuncPtr realFunction = cast(FuncPtr) getFunction; Don't call the FARPROC, just cast it.
Re: Trouble with DLL address
The problem is FARPROC. Thank you everybody. Solution: import core.runtime; import std.c.windows.windows; import std.stdio; alias extern(Windows) int function(int) FuncPtr; alias extern(Windows) FuncPtr function() GetFuncPtr; int main(string[] args) { HMODULE dll= LoadLibraryA(mydll64.DLL); GetFuncPtr getFunction = cast(GetFuncPtr) GetProcAddress(dll, GetFunction); FuncPtr realFunction = cast(FuncPtr) getFunction(); writefln(dll address: %08x, dll); writefln(GetFunction address: %08x, getFunction); writefln(RealFunction address: %08x, realFunction); writefln(RealFunction result: %d, realFunction(7)); return 0; }