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