mirror of https://github.com/axmolengine/axmol.git
232 lines
5.6 KiB
C++
232 lines
5.6 KiB
C++
|
||
#include "ssGlobal.h"
|
||
#include "ssTsd.h"
|
||
#include "TG3_Type.h"
|
||
#include <stdio.h>
|
||
#include "TCOM.h"
|
||
#include "ssAppMgr.h"
|
||
#include "TG3AppDllEntry.h"
|
||
|
||
#ifdef __TCOM_SUPPORT__
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
//实现TCOM所需要的DLL函数
|
||
|
||
//DLL提供的获取指定CLSID的指定接口
|
||
SS_EXPORT HRESULT TDllGetClassObject(TREFCLSID rclsid, TREFIID riid, LPVOID * ppv);
|
||
|
||
//DLL提供的查询DLL能否被Unload
|
||
SS_EXPORT HRESULT TDllCanUnloadNow(void);
|
||
|
||
//DLL提供的把DLL的TCOM信息加入到注册表
|
||
SS_EXPORT HRESULT TDllRegisterServer(void);
|
||
|
||
//DLL提供的把DLL的TCOM信息从注册表中删除
|
||
SS_EXPORT HRESULT TDllUnregisterServer(void);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#ifdef __TCOM_OUTPUT_DEBUG_INFO__
|
||
#include <stdio.h>
|
||
#endif
|
||
|
||
//TCOM实现中需要用到的函数和数据
|
||
|
||
//实例对象被引用的次数
|
||
static Int32 __TCOM_ClsidInstanceRefCount;
|
||
|
||
//ClassFactory被Locked的次数
|
||
static Int32 __TCOM_CalssFactoryLockedCount;
|
||
|
||
//做必要的初始化
|
||
static Int32 __TCOM_Init()
|
||
{
|
||
__TCOM_ClsidInstanceRefCount = 0;
|
||
__TCOM_CalssFactoryLockedCount = 0;
|
||
return 0;
|
||
}
|
||
|
||
//做必要的清除工作
|
||
static Int32 __TCOM_DeInit()
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
//DLL全局使用:增加对象实例被引用次数
|
||
Int32 TCOM_AddClsidInstanceRefCount()
|
||
{
|
||
__TCOM_ClsidInstanceRefCount++;
|
||
#ifdef __TCOM_OUTPUT_DEBUG_INFO__
|
||
SS_printf("[TCOM_SYSTEM] TCOM_AddClsidInstanceRefCount: address: %p, value: %d.\n",
|
||
&__TCOM_ClsidInstanceRefCount, __TCOM_ClsidInstanceRefCount);
|
||
#endif
|
||
if(__TCOM_ClsidInstanceRefCount <= 0)
|
||
{
|
||
return 0;
|
||
}
|
||
return __TCOM_ClsidInstanceRefCount;
|
||
}
|
||
|
||
//DLL全局使用:减少对象实例被引用次数
|
||
Int32 TCOM_DecClsidInstanceRefCount()
|
||
{
|
||
__TCOM_ClsidInstanceRefCount--;
|
||
#ifdef __TCOM_OUTPUT_DEBUG_INFO__
|
||
SS_printf("[TCOM_SYSTEM] TCOM_DecClsidInstanceRefCount: address: %p, value: %d.\n",
|
||
&__TCOM_ClsidInstanceRefCount, __TCOM_ClsidInstanceRefCount);
|
||
#endif
|
||
if(__TCOM_ClsidInstanceRefCount <= 0)
|
||
{
|
||
return 0;
|
||
}
|
||
return __TCOM_ClsidInstanceRefCount;
|
||
}
|
||
|
||
//DLL全局使用:增加ClassFactory被Locked的次数
|
||
Int32 TCOM_AddCalssFactoryLockedCount()
|
||
{
|
||
__TCOM_CalssFactoryLockedCount++;
|
||
#ifdef __TCOM_OUTPUT_DEBUG_INFO__
|
||
SS_printf("[TCOM_SYSTEM] TCOM_AddCalssFactoryLockedCount: address: %p, value: %d.\n",
|
||
&__TCOM_CalssFactoryLockedCount, __TCOM_CalssFactoryLockedCount);
|
||
#endif
|
||
if(__TCOM_CalssFactoryLockedCount <= 0)
|
||
{
|
||
return 0;
|
||
}
|
||
return __TCOM_CalssFactoryLockedCount;
|
||
}
|
||
|
||
//DLL全局使用:减少ClassFactory被Locked的次数
|
||
Int32 TCOM_DecCalssFactoryLockedCount()
|
||
{
|
||
__TCOM_CalssFactoryLockedCount--;
|
||
#ifdef __TCOM_OUTPUT_DEBUG_INFO__
|
||
SS_printf("[TCOM_SYSTEM] TCOM_DecCalssFactoryLockedCount: address: %p, value: %d.\n",
|
||
&__TCOM_CalssFactoryLockedCount, __TCOM_CalssFactoryLockedCount);
|
||
#endif
|
||
if(__TCOM_CalssFactoryLockedCount <= 0)
|
||
{
|
||
return 0;
|
||
}
|
||
return __TCOM_CalssFactoryLockedCount;
|
||
}
|
||
|
||
//实现TCOM所需要的DLL函数
|
||
|
||
//DLL提供的获取指定CLSID的指定接口
|
||
SS_EXPORT HRESULT TDllGetClassObject(TREFCLSID rclsid, TREFIID riid, LPVOID * ppv)
|
||
{
|
||
return TCOM_Srv_GetClassObject(rclsid, riid, ppv);
|
||
}
|
||
|
||
//DLL提供的查询DLL能否被Unload
|
||
SS_EXPORT HRESULT TDllCanUnloadNow(void)
|
||
{
|
||
#ifdef __TCOM_OUTPUT_DEBUG_INFO__
|
||
SS_printf("[TCOM_SYSTEM] TDllCanUnloadNow: address1: %p, address2: %p, value1: %d, value2: %d.\n",
|
||
&__TCOM_ClsidInstanceRefCount, &__TCOM_CalssFactoryLockedCount, __TCOM_ClsidInstanceRefCount,
|
||
__TCOM_CalssFactoryLockedCount);
|
||
#endif
|
||
if((__TCOM_ClsidInstanceRefCount <= 0) && (__TCOM_CalssFactoryLockedCount <= 0))
|
||
return TCOM_S_TRUE;
|
||
return TCOM_S_FALSE;
|
||
}
|
||
|
||
//DLL提供的把DLL的TCOM信息加入到注册表
|
||
SS_EXPORT HRESULT TDllRegisterServer(void)
|
||
{
|
||
return TCOM_Srv_RegisterServer();
|
||
}
|
||
|
||
//DLL提供的把DLL的TCOM信息从注册表中删除
|
||
SS_EXPORT HRESULT TDllUnregisterServer(void)
|
||
{
|
||
return TCOM_Srv_UnregisterServer();
|
||
}
|
||
|
||
#endif //__TCOM_SUPPORT__
|
||
|
||
#ifdef _WIN32
|
||
|
||
#ifndef SS_MAKEDLL
|
||
#error Error!!! SS_MAKEDLL Must defined!
|
||
#endif
|
||
|
||
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
||
{
|
||
switch (ul_reason_for_call)
|
||
{
|
||
case DLL_PROCESS_ATTACH:
|
||
//进程加载动态库进行的操作
|
||
#ifdef __TCOM_SUPPORT__
|
||
__TCOM_Init();
|
||
#endif
|
||
break;
|
||
case DLL_THREAD_ATTACH:
|
||
//线程加载动态库进行的操作
|
||
break;
|
||
case DLL_THREAD_DETACH:
|
||
//线程卸载动态库进行的操作
|
||
break;
|
||
case DLL_PROCESS_DETACH:
|
||
//进程卸载动态库进行的操作
|
||
#ifdef __TCOM_SUPPORT__
|
||
__TCOM_DeInit();
|
||
#endif
|
||
break;
|
||
}
|
||
return TRUE;
|
||
}
|
||
#else //linux
|
||
|
||
#ifndef SS_SHARED
|
||
#error Error!!! SS_SHARED Must defined!
|
||
#endif
|
||
|
||
void __attribute((constructor)) TG3_Dll_Attach()
|
||
{
|
||
//进程加载动态库进行的操作
|
||
#ifdef __TCOM_SUPPORT__
|
||
__TCOM_Init();
|
||
#endif
|
||
}
|
||
|
||
void __attribute((destructor)) TG3_Dll_Detach()
|
||
{
|
||
//进程卸载动态库进行的操作
|
||
#ifdef __TCOM_SUPPORT__
|
||
__TCOM_DeInit();
|
||
#endif
|
||
}
|
||
|
||
#endif
|
||
|
||
//如果不是作为TG3的动态库应用,请在VC项目中和TMK3文件中定义 __TG3_PURE_DLL__ 宏
|
||
#ifndef __TG3_PURE_DLL__
|
||
|
||
//动态库应用使用的统一导出名字的入口函数
|
||
SS_EXPORT Int32 TDllTG3AppMain(const TUChar * pAppID, UInt32 nCmd, void * pCmdParam)
|
||
{
|
||
Int32 retValue;
|
||
|
||
//初始化TCOM
|
||
TCoInitialize(NULL);
|
||
|
||
retValue = TG3AppMain(pAppID, nCmd, pCmdParam);
|
||
|
||
//释放TCOM
|
||
TCoUninitialize();
|
||
|
||
return retValue;
|
||
}
|
||
|
||
#endif
|
||
|
||
|