Calling D from C++
Johann MacDonagh
johann.macdonagh.no at spam.gmail.com
Sun Jul 17 13:51:09 PDT 2011
On 7/17/2011 3:53 PM, Loopback wrote:
> On 2011-07-17 21:45, Loopback wrote:
>> Hello!
>>
>> As of my understanding you can write usable c libraries in D by using
>> extern(C). The problem is that I haven't found any other threads asking
>> the same question about C++ (since extern for c++ exists as well). So
>> I have two questions, is it possible to write a dll in D usable in c++
>> code, and if the answer is yes, are there any restrictions?
>>
>> Am I forced to use explicit memory handling, or can this be handled by
>> the garbage collection internally by the dll etc?
>
> Sorry for mentioning this a bit late but noticed this now;
> http://www.digitalmars.com/d/2.0/cpp_interface.html
>
> Although if someone has own experiences or something interesting to say
> about the matter, please do.
I think you're going to be better off defining your D routines as
extern(C) and then defining the C++ headers as __cdecl (for Windows of
course). C++ can, of course, link against libraries using cdecl.
If you write your D DLL with the normal DllEntry (this came from VisualD):
import std.c.windows.windows;
import core.dll_helper;
__gshared HINSTANCE g_hInst;
extern (Windows)
BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved)
{
switch (ulReason)
{
case DLL_PROCESS_ATTACH:
g_hInst = hInstance;
dll_process_attach( hInstance, true );
break;
case DLL_PROCESS_DETACH:
dll_process_detach( hInstance, true );
break;
case DLL_THREAD_ATTACH:
dll_thread_attach( true, true );
break;
case DLL_THREAD_DETACH:
dll_thread_detach( true, true );
break;
}
return true;
}
Then as soon as your DLL is loaded the D runtime will start. Any memory
allocated in the D DLL will be garbage collected as you'd imagine.
Obviously, it's not going to free any memory allocated in your C++ code ;)
More information about the Digitalmars-d-learn
mailing list