Passing C++ class to DLL for callbacks from D (Steam)
evilrat
evilrat666 at gmail.com
Fri Jun 8 06:24:03 UTC 2018
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.
More information about the Digitalmars-d-learn
mailing list