Trouble with DLL address

dennis luehring dl.soluz at gmx.net
Mon Jan 14 01:20:44 PST 2013


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:          180000000
>> GetFunction address:  180001020
>> RealFunction address: ffffffff80001000
>> <CRASH>
>>
>> BTW, this works:
>> FuncPtr realFunction = cast(FuncPtr) (getFunction() &
>> 0x00000000ffffffff | cast(size_t) dll);
>>
>



More information about the Digitalmars-d-learn mailing list