View mode: basic / threaded / horizontal-split · Log in · Help
December 31, 2011
Mixing D and C - Windows
C program loads D dll
or
D program loads C dll
Is it possible?

-- 
 
 D
December 31, 2011
Re: Mixing D and C - Windows
On Saturday, 31 December 2011 at 19:05:44 UTC, DNewbie wrote:
> C program loads D dll
> or
> D program loads C dll
> Is it possible?

Both are possible.

Here's how to create a DLL in D, usable from C:

http://dlang.org/dll.html

As for loading C symbols in a DLL from a D program, you must link 
against an import library of the DLL, and create an interface 
module (similar to a header file) with the C declarations. For 
example, if this is your C DLL:

-----------
#include <stdio.h>

__declspec(dllexport) void sayHello(const char* name)
{
   printf("hello, %s!", name);
}
-----------

Then your D interface module should look like this:
-----------
extern(C) void sayHello(const char* name);

-----------

The import library must be in the OMF format. The easiest way to 
get such an import library is to use the `impllib` tool which can 
be downloaded from here:

http://ftp.digitalmars.com/bup.zip
January 01, 2012
Re: Mixing D and C - Windows
Jakob Ovrum Wrote:
> As for loading C symbols in a DLL from a D program, you must link 
> against an import library of the DLL, and create an interface 
> module (similar to a header file) with the C declarations.
Alternatively, you can load the DLL via the Windows API.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx
January 03, 2012
Re: Mixing D and C - Windows
Thank you both.

I've created a D DLL [http://dlang.org/dll.html], then I've loaded it from a C program [compiled with dmc].
However, I'd want to be able to call it from a C program compiled with MSVC, and I got a link error - unresolved external symbol [link testdll.obj /implib:mydll.lib /out:testdll-msvc.exe]. The LoadLibrary works with both DMC/MSVC, but it isn't 'handy'.?.



On Sat, Dec 31, 2011, at 07:20 PM, Exec wrote:
> Jakob Ovrum Wrote:
> > As for loading C symbols in a DLL from a D program, you must link 
> > against an import library of the DLL, and create an interface 
> > module (similar to a header file) with the C declarations.
> Alternatively, you can load the DLL via the Windows API.
> http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx
> 


-- 
 
 D
January 03, 2012
Re: Mixing D and C - Windows
On 1/3/2012 10:02 AM, DNewbie wrote:
> Thank you both.
>
> I've created a D DLL [http://dlang.org/dll.html], then I've loaded it from a C program [compiled with dmc].
> However, I'd want to be able to call it from a C program compiled with MSVC, and I got a link error - unresolved external symbol [link testdll.obj /implib:mydll.lib /out:testdll-msvc.exe]. The LoadLibrary works with both DMC/MSVC, but it isn't 'handy'.?.
>
>

That's because the object file formats used by DMC and MSVC are 
different. DMC outputs OMF, MSCV uses COFF. If you download objconv[1], 
you can use it to convert between the two formats. Something like

objconv -fcoff -nu mydll.lib mydll_mscv.lib

should do the trick.

[1] http://www.agner.org/optimize/objconv.zip
January 03, 2012
Re: Mixing D and C - Windows
On 1/3/2012 12:43 PM, Mike Parker wrote:
> On 1/3/2012 10:02 AM, DNewbie wrote:
>> Thank you both.
>>
>> I've created a D DLL [http://dlang.org/dll.html], then I've loaded it
>> from a C program [compiled with dmc].
>> However, I'd want to be able to call it from a C program compiled with
>> MSVC, and I got a link error - unresolved external symbol [link
>> testdll.obj /implib:mydll.lib /out:testdll-msvc.exe]. The LoadLibrary
>> works with both DMC/MSVC, but it isn't 'handy'.?.
>>
>>
>
> That's because the object file formats used by DMC and MSVC are
> different. DMC outputs OMF, MSCV uses COFF. If you download objconv[1],
> you can use it to convert between the two formats. Something like
>
> objconv -fcoff -nu mydll.lib mydll_mscv.lib
>
> should do the trick.
>
> [1] http://www.agner.org/optimize/objconv.zip

Or did you do that already? I just realized that would likely give a 
corrupt file error, not an unresolved symbol.
January 03, 2012
Re: Mixing D and C - Windows
Maybe I'm wrong, but IIRC objconv won't work on import libs.

But there are other ways to do it: http://support.microsoft.com/kb/131313
Top | Discussion index | About this forum | D home