February 21, 2008
I am working on prototyping the conversion of my companies C++ assets to D language in order to break away from COM and make cross-platform complimation an easier process. I am currently working with Windows DLL and EXE.

I have a simple D DLL that has a class, two interfaces, and a class factory function. I am exporting the class factory function and the interfaces using the standard export keyword. I have an exe which attempts to create the class through the class factory function and casts the object to one of the interfaces.

When I link the DLL to the exe it finds the definition for the class factory function but not the interfaces. My question is how do you link interfaces from a D DLL into a D Exe. Does anyone have an example of doing this or can someone point me in the right direction. My company would like to move to D and I need to get this working in order to do this.

I am creating a lib file from the DLL and linking statically to the EXE. I get a symbol undefined error for the IWindow interface.

Any help is really appreciated as the documention for creating DLL's is extremely limited and I have a small window of opportunity to get this working.

Example Code is below:

/*-----DLL Code Snippet------*/
module dllex;
export interface IWindow {
    int Create();
    int get_Window(out long hWnd);
}

export interface IHostWindowLite : IWindow {
    int get_Object(out Object HostedObject);
    int put_ObjectName(wchar* ObjectName);
    int get_ObjectName(wchar** ObjectName);

    int Control(long ParamID, long Param);
    int Inquire(long ParamID, out long Param);
}

class CHostWindowLite :
        public IWindow,
        public IHostWindowLite {
 ...
}

export Object getHostWindowLite(){
      return new CHostWindowLite();
}


/*----EXE Code Snippet----*/
import dllex;

Object obj = getHostWindowLite();
IWindow wnd = cast(IWindow) obj;
if(wnd)
       wnd.Create();