On Friday, 8 June 2018 at 00:55:35 UTC, cc wrote:

I've defined it in D, as per https://dlang.org/spec/cpp_interface.html#classes :


change this to class, or even abstract class as shown in example

extern(C++) {
        interface CCallbackBase {
                //this() { m_nCallbackFlags = 0; m_iCallback = 0; }
                void Run( void *pvParam );
void Run( void *pvParam, bool bIOFailure, SteamAPICall_t hSteamAPICall );
                int GetICallback();
                int GetCallbackSizeBytes();

enum { k_ECallbackFlagsRegistered = 0x01, k_ECallbackFlagsGameServer = 0x02 }
                //uint8 m_nCallbackFlags;
                //int m_iCallback;
                //friend class CCallbackMgr;

                //CCallbackBase( const CCallbackBase& );
                //CCallbackBase& operator=( const CCallbackBase& );
        }
}

add extern(C++) to class as well to

class CImpl : CCallbackBase {
        extern(C++) {
                this() { m_nCallbackFlags = 0; m_iCallback = 0; }
                void Run( void *pvParam ) { writeln("Run1"); }
void Run( void *pvParam, bool bIOFailure, SteamAPICall_t hSteamAPICall ) { writeln("Run2"); }
                int GetICallback() { return m_iCallback; }
int GetCallbackSizeBytes() { return NumberOfCurrentPlayers_t.sizeof; } // ordinarily use templates to determine what type struct ptr to return
        }
        uint8 m_nCallbackFlags;
        int m_iCallback;
}


you also may or may not need to mark non-virtual C++ methods as final.

Of course I haven't used D for quite some time so I can be mistaken.

But the lesson I learned the hard way is that in D for extern(C++) you don't use interface(it simply has no mapping to C++ types?), and for defining COM-interfaces use interface or it will bite you.
I hope it helps.

Reply via email to