Thread overview
Mixing D and C - Windows
Dec 31, 2011
DNewbie
Dec 31, 2011
Jakob Ovrum
Jan 01, 2012
Exec
Jan 03, 2012
DNewbie
Jan 03, 2012
Mike Parker
Jan 03, 2012
Mike Parker
Jan 03, 2012
Andrej Mitrovic
December 31, 2011
C program loads D dll
or
D program loads C dll
Is it possible?

-- 

  D
December 31, 2011
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
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
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
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
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
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