You'd better read some more authorative source since my experience is very limited on that matter, but here is some quick notes

On Thursday, 2 November 2017 at 14:22:56 UTC, Guillaume Piolat wrote:

Question 1. Is it mandatory to inherit from core.sys.windows.unknwn.IUnknown, or just having an interface named "IUnknown" validate it for being a COM interface?

If yes, then how am I supposed to use COM interfaces in other OSes? core.sys.windows.unknwn.IUnknown is defined under version(Windows).

   I wonder what the exact compiler hook is.


You can't(or maybe you can but that is not a true COM). COM is Windows tech. It is backed up by OLE or whatever server it is.

My guess it will work fine when derive from any extern(Windows) interface(that's right, not class) that has base 3 methods(AddRef, Release, QueryInterface)

It is also tied to a Windows registry, since to be able to create COM objects using CoCreateInstance its class factory has to be registered with class id (CLSID), then IIRC, for example in C# creating a COM object instance(using new) makes corresponding lookup by GUID to retrieve CLSID and CoCreateInstance calls that factory to make an object. But you don't have to use COM mechanincs on your COM enabled classes inside your code.

Now there can be a problem, say for example you want to make a COM class in D for external usage, most likely you will have to make interface first, then derive a class for actual implementation, because class will add stuff to vtable and break order. (just a guess)


Question 2. If this fails, may I emulate COM vtable layout with extern(C++) class? I wonder what the exact differences are anyway between extern(C++) and the special IUnknown.


I don't know the exact internals mechanics, but yes, not sure if extern(C++) will work though. COM can be used from C, and so COM methods is basically a C function that takes object as first argument, so on C++ side it is flavored to make a vtable and respective method calls(or vice versa, depending how the specific class implemented). (like I said, find some better read on this)

Also since it can be implemented in C, and that requires manually making COM vtable in there(IIRC with an array), you can just do the same in D.


Question 3. It seems I can inherit both from A D object and a COM interface. What will be the choosen layout?


like I said in Q2, if your goal is to make COM class accessible by other languages then make interface derived from IUnknown(or any other COM interface you like) and fill in the methods, but implement them in derived from that interface class. (again, just a guess, because of vtable shifting) and don't forget, on Windows you also must register a class factory (see IClassFactory.CreateInstance) to be able to create objects from other COM clients.

Reply via email to