Thread overview
Windows parameter
Jun 30, 2013
shuji
Jun 30, 2013
Simen Kjaeraas
Jun 30, 2013
shuji
Jun 30, 2013
Anthony Goins
Jun 30, 2013
shuji
Jun 30, 2013
David
June 30, 2013
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.
June 30, 2013
On Sun, 30 Jun 2013 20:24:17 +0200, shuji <cravstar@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
June 30, 2013
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++) {}
June 30, 2013
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)
June 30, 2013
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.
June 30, 2013
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.