Windows parameter
Can someone help me with this: I have a library which I try to import from D //funcs.lib //windows includes... HWND hwnd; int setHWND(HWND extHwnd){ hwnd = extHwnd; return 0; } //main.d pragma(lib, gdi32.lib); import core.runtime; import core.sys.windows.windows; extern (C++) { int setHWND(HWND hwnd); } int main(int argc, char **argv) { //windows initializers setHWND(hwnd); return 0; } but when I try to import that function this comes: Error 42: Symbol Undefined ?setHWND@@YAHPAX@Z (int cdecl setHWND(void *)) --- errorlevel 1 it seems like I cannot use HWND directly.
Re: Windows parameter
On Sun, 30 Jun 2013 20:24:17 +0200, shuji cravs...@hotmail.com wrote: int setHWND(HWND extHwnd){ hwnd = extHwnd; return 0; } And: extern (C++) { int setHWND(HWND hwnd); } See how these are different? One of them is an extern (C++) function, the other is a D function. In other words, this should work: //funcs.lib //windows includes... HWND hwnd; extern (C++) { // This line! int setHWND(HWND extHwnd){ hwnd = extHwnd; return 0; } } //main.d pragma(lib, gdi32.lib); import core.runtime; import core.sys.windows.windows; extern (C++) { int setHWND(HWND hwnd); } int main(int argc, char **argv) { //windows initializers setHWND(hwnd); return 0; } -- Simen
Re: Windows parameter
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++) {}
Re: Windows parameter
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)
Re: Windows parameter
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.
Re: Windows parameter
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.