#ifndef INTERFACE_H #define INTERFACE_H #ifdef _WIN32 #pragma once #endif class IBaseInterface { public: virtual ~IBaseInterface() {} }; #if !defined( _X360 ) #define CREATEINTERFACE_PROCNAME "CreateInterface" #else #define CREATEINTERFACE_PROCNAME ((const char*)1) #endif typedef void* (*CreateInterfaceFn)(const char* pName, int* pReturnCode); typedef void* (*InstantiateInterfaceFn)(); class InterfaceReg { public: InterfaceReg(InstantiateInterfaceFn fn, const char* pName); public: InstantiateInterfaceFn m_CreateFn; const char* m_pName; InterfaceReg* m_pNext; static InterfaceReg* s_pInterfaceRegs; }; #if !defined(_STATIC_LINKED) || !defined(_SUBSYSTEM) #define EXPOSE_INTERFACE_FN(functionName, interfaceName, versionName) \ static InterfaceReg __g_Create##interfaceName##_reg(functionName, versionName); #else #define EXPOSE_INTERFACE_FN(functionName, interfaceName, versionName) \ namespace _SUBSYSTEM \ { \ static InterfaceReg __g_Create##interfaceName##_reg(functionName, versionName); \ } #endif #if !defined(_STATIC_LINKED) || !defined(_SUBSYSTEM) #define EXPOSE_INTERFACE(className, interfaceName, versionName) \ static void* __Create##className##_interface() {return static_cast( new className );} \ static InterfaceReg __g_Create##className##_reg(__Create##className##_interface, versionName ); #else #define EXPOSE_INTERFACE(className, interfaceName, versionName) \ namespace _SUBSYSTEM \ { \ static void* __Create##className##_interface() {return static_cast( new className );} \ static InterfaceReg __g_Create##className##_reg(__Create##className##_interface, versionName ); \ } #endif #if !defined(_STATIC_LINKED) || !defined(_SUBSYSTEM) #define EXPOSE_SINGLE_INTERFACE_GLOBALVAR_WITH_NAMESPACE(className, interfaceNamespace, interfaceName, versionName, globalVarName) \ static void* __Create##className##interfaceName##_interface() {return static_cast( &globalVarName );} \ static InterfaceReg __g_Create##className##interfaceName##_reg(__Create##className##interfaceName##_interface, versionName); #else #define EXPOSE_SINGLE_INTERFACE_GLOBALVAR_WITH_NAMESPACE(className, interfaceNamespace, interfaceName, versionName, globalVarName) \ namespace _SUBSYSTEM \ { \ static void* __Create##className##interfaceName##_interface() {return static_cast( &globalVarName );} \ static InterfaceReg __g_Create##className##interfaceName##_reg(__Create##className##interfaceName##_interface, versionName); \ } #endif #define EXPOSE_SINGLE_INTERFACE_GLOBALVAR(className, interfaceName, versionName, globalVarName) \ EXPOSE_SINGLE_INTERFACE_GLOBALVAR_WITH_NAMESPACE(className, , interfaceName, versionName, globalVarName) #if !defined(_STATIC_LINKED) || !defined(_SUBSYSTEM) #define EXPOSE_SINGLE_INTERFACE(className, interfaceName, versionName) \ static className __g_##className##_singleton; \ EXPOSE_SINGLE_INTERFACE_GLOBALVAR(className, interfaceName, versionName, __g_##className##_singleton) #else #define EXPOSE_SINGLE_INTERFACE(className, interfaceName, versionName) \ namespace _SUBSYSTEM \ { \ static className __g_##className##_singleton; \ } \ EXPOSE_SINGLE_INTERFACE_GLOBALVAR(className, interfaceName, versionName, __g_##className##_singleton) #endif class CSysModule; enum { IFACE_OK = 0, IFACE_FAILED }; void* CreateInterface(const char* pName, int* pReturnCode); #if defined( _X360 ) DLL_EXPORT void* CreateInterfaceThunk(const char* pName, int* pReturnCode); #endif extern CreateInterfaceFn Sys_GetFactory(CSysModule* pModule); extern CreateInterfaceFn Sys_GetFactory(const char* pModuleName); extern CreateInterfaceFn Sys_GetFactoryThis(void); enum Sys_Flags { SYS_NOFLAGS = 0x00, SYS_NOLOAD = 0x01 }; extern CSysModule* Sys_LoadModule(const char* pModuleName, Sys_Flags flags = SYS_NOFLAGS); extern void Sys_UnloadModule(CSysModule* pModule); bool Sys_LoadInterface( const char* pModuleName, const char* pInterfaceVersionName, CSysModule** pOutModule, void** pOutInterface); bool Sys_IsDebuggerPresent(); class CDllDemandLoader { public: CDllDemandLoader(char const* pchModuleName); virtual ~CDllDemandLoader(); CreateInterfaceFn GetFactory(); void Unload(); private: char const* m_pchModuleName; CSysModule* m_hModule; bool m_bLoadAttempted; }; #endif