mirror of
https://github.com/0TheSpy/Seaside.git
synced 2025-01-10 03:18:50 +08:00
140 lines
4.4 KiB
C++
140 lines
4.4 KiB
C++
#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<interfaceName *>( 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<interfaceName *>( 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<interfaceNamespace interfaceName *>( &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<interfaceNamespace interfaceName *>( &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
|