www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.announce - Re: QtD 0.1 is out!

reply Eldar Insafutdinov <e.insafutdinov gmail.com> writes:
Bill Baxter Wrote:

 On Fri, Feb 13, 2009 at 5:00 AM, Eldar Insafutdinov
 <e.insafutdinov gmail.com> wrote:
 Bill Baxter Wrote:

 On Fri, Feb 13, 2009 at 4:22 AM, Eldar Insafutdinov
 <e.insafutdinov gmail.com> wrote:
 Can somebody help me with exporting functions from a DLL? I am defining
functions in C++ like
 extern "C" __declspec(dllexport) void* __qtd_QObject_QObject_QObject(args)
 After compiling a DLL with MINGW and producing a lib file for it with implib I
am trying to use them from D.
 In D I declare them as
 extern (C) void* __qtd_QObject_QObject_QObject(args);
 And then compile it and link it to the .lib file made by implib for that DLL,
but optlink complains that symbol is undefined. I tried to use that Cfunction
from C++ and it worked. What I can do?

What's the implib command you're using? Often you need to use the /system flag. --bb

okay, second problem then - I need to be able to call extern (C) functions defined in D code from DLL. I tried to do getProcAddress(NULL, "__some_D_func"); but this doesn't work.

I think you may have to write some code to explicitly register your D functions with the DLL. You could write a mini getDCodeProcAddress kind of thing in your D code. Then give a pointer to that function to the C code in the DLL at startup. Then C code uses getDCodeProcAddress from there. Maybe there's an easier way, but that's what I'd try. --bb

This way won't really work because there are dozens of such a functions - that's for virtual dispatch. I have just solved it by declaring functions "export extern (C)" and adding "_" prefix to function name when calling GetProcAddress. So technically there are no issues to make qtd working on windows!
Feb 12 2009
next sibling parent reply Max Samukha <samukha voliacable.com.removethis> writes:
On Thu, 12 Feb 2009 15:48:07 -0500, Eldar Insafutdinov
<e.insafutdinov gmail.com> wrote:

Bill Baxter Wrote:

 On Fri, Feb 13, 2009 at 5:00 AM, Eldar Insafutdinov
 <e.insafutdinov gmail.com> wrote:
 Bill Baxter Wrote:

 On Fri, Feb 13, 2009 at 4:22 AM, Eldar Insafutdinov
 <e.insafutdinov gmail.com> wrote:
 Can somebody help me with exporting functions from a DLL? I am defining
functions in C++ like
 extern "C" __declspec(dllexport) void* __qtd_QObject_QObject_QObject(args)
 After compiling a DLL with MINGW and producing a lib file for it with implib I
am trying to use them from D.
 In D I declare them as
 extern (C) void* __qtd_QObject_QObject_QObject(args);
 And then compile it and link it to the .lib file made by implib for that DLL,
but optlink complains that symbol is undefined. I tried to use that Cfunction
from C++ and it worked. What I can do?

What's the implib command you're using? Often you need to use the /system flag. --bb

okay, second problem then - I need to be able to call extern (C) functions defined in D code from DLL. I tried to do getProcAddress(NULL, "__some_D_func"); but this doesn't work.

I think you may have to write some code to explicitly register your D functions with the DLL. You could write a mini getDCodeProcAddress kind of thing in your D code. Then give a pointer to that function to the C code in the DLL at startup. Then C code uses getDCodeProcAddress from there. Maybe there's an easier way, but that's what I'd try. --bb

This way won't really work because there are dozens of such a functions - that's for virtual dispatch. I have just solved it by declaring functions "export extern (C)" and adding "_" prefix to function name when calling GetProcAddress. So technically there are no issues to make qtd working on windows!

You are a genius! ;)
Feb 12 2009
parent Eldar Insafutdinov <e.insafutdinov gmail.com> writes:
Max Samukha Wrote:

 On Thu, 12 Feb 2009 15:48:07 -0500, Eldar Insafutdinov
 <e.insafutdinov gmail.com> wrote:
 
Bill Baxter Wrote:

 On Fri, Feb 13, 2009 at 5:00 AM, Eldar Insafutdinov
 <e.insafutdinov gmail.com> wrote:
 Bill Baxter Wrote:

 On Fri, Feb 13, 2009 at 4:22 AM, Eldar Insafutdinov
 <e.insafutdinov gmail.com> wrote:
 Can somebody help me with exporting functions from a DLL? I am defining
functions in C++ like
 extern "C" __declspec(dllexport) void* __qtd_QObject_QObject_QObject(args)
 After compiling a DLL with MINGW and producing a lib file for it with implib I
am trying to use them from D.
 In D I declare them as
 extern (C) void* __qtd_QObject_QObject_QObject(args);
 And then compile it and link it to the .lib file made by implib for that DLL,
but optlink complains that symbol is undefined. I tried to use that Cfunction
from C++ and it worked. What I can do?

What's the implib command you're using? Often you need to use the /system flag. --bb

okay, second problem then - I need to be able to call extern (C) functions defined in D code from DLL. I tried to do getProcAddress(NULL, "__some_D_func"); but this doesn't work.

I think you may have to write some code to explicitly register your D functions with the DLL. You could write a mini getDCodeProcAddress kind of thing in your D code. Then give a pointer to that function to the C code in the DLL at startup. Then C code uses getDCodeProcAddress from there. Maybe there's an easier way, but that's what I'd try. --bb

This way won't really work because there are dozens of such a functions - that's for virtual dispatch. I have just solved it by declaring functions "export extern (C)" and adding "_" prefix to function name when calling GetProcAddress. So technically there are no issues to make qtd working on windows!

You are a genius! ;)

No, you are ;)
Feb 12 2009
prev sibling parent Eldar Insafutdinov <e.insafutdinov gmail.com> writes:
Eldar Insafutdinov Wrote:

 This way won't really work because there are dozens of such a functions -
that's for virtual dispatch. I have just solved it by declaring functions
"export extern (C)" and adding "_" prefix to function name when calling
GetProcAddress. So technically there are no issues to make qtd working on
windows!

So porting qtd to windows almost finished, but I experienced couple of new problems. One of them is that these callback functions that I declare on D side(as export extern C) of the binding and that should be called from C++ part which sits in DLL, they are not put by linker into executable if they are in a static library. If I compile module which contains them with the resulting executable - it works fine, functions are in executable. I tried -L/-L/NOPACKFUNCTIONS but it didn't help. What can solve this problem? Thank you.
Feb 14 2009