Am 30.06.2013 22:20, schrieb shuji: > On Sunday, 30 June 2013 at 20:04:12 UTC, Anthony Goins wrote: >> On Sunday, 30 June 2013 at 19:03:13 UTC, shuji wrote: >>> this code is in a .cpp file >>> //funcs.lib >>> //windows includes... >>> HWND hwnd; >>> int setHWND(HWND extHwnd){ >>> hwnd = extHwnd; >>> return 0; >>> } >>> >>> So im trying to import from D like this. I dont think I can implement >>> this line in C++ >>> extern (C++) {} >> >> I'm probably the most unqualified person to offer help but are you >> sure you are linking with funcs.lib (assuming setHWND is defined there) > > yes, i have called other functions in the same file correctly. > > PD I can call a function with void* as receiving paremeter: > //main.d > extern (C++) { > int setHWND(void* ehwnd); > } > //mylib.cpp > int setmyHWND(void* exthwnd){ > hwnd = (HWND)exthwnd; > return 0; > } > and then cast on C++ to HWND, but I think it would be better to send the > parameter correctly as HWND.
make sure the HWND parameter is on both "sides" the same (it has to get mangled correctly!). I don't know if HWND is an opaque struct, if it is, this might get you into trouble. --- Cut here, I looked into core.sys.windows.windows: --- alias void *HANDLE; alias HANDLE HWND; --- That is the problem, on the C++-Side HWND is not of type void* hence it gets mangled differently, you need to get DMD mangle it the same as the C++ compiler does... The problem is (I just looked it up) HWND is *basically* void* All typedefs: PVOID = void* HANDLE = PVOID HWND = HANDLE So you have to "emulate" a typedef to get the correct mangling... Maybe start messing arround with structs? struct HWND; etc. Maybe you could also try to use the deprecated "typedef" in D. Neither of these soloutions are really great. I would consider this another bug on the extern(C++) list.