I've go a small DLL and a test module both written in D. Why do I need to use the extern(C)? Shouldn't both sides be using D name wrangling?

-------------------- mydll.d --------------------------------
module mydll;

extern(C):   // removing or changing to (D): results in error

export
{
    int addSeven(int a, int b) { return a+b+7; }
}


-------------------- user.d --------------------------------
module user;

import core.sys.windows.winbase;
import std.stdio;

void main()
{
    alias addSevenFuncSignature = int function(int, int);

    addSevenFuncSignature  addSeven;

    import core.runtime;
    auto mydll = Runtime.loadLibrary("mydll.dll");

    assert(mydll);

addSeven = cast(addSevenFuncSignature) GetProcAddress(mydll, "addSeven");

    int ret = addSeven(2,3);

    writeln("calling addSeven(2,3) = ", addSeven(2,3));

    Runtime.unloadLibrary(mydll);
}

------------------- execution results ------------------------------

c:\D\dmd2\samples\d\mydll>dmd -m64 mydll.d -L/DLL -L/NOENTRY
   Creating library mydll.lib and object mydll.exp

c:\D\dmd2\samples\d\mydll>dmd -m64 user.d

c:\D\dmd2\samples\d\mydll>user.exe
calling addSeven(2,3) = 12


Reply via email to