提交 d0e063ba 编写于 作者: GamebabyRockSun_QQ's avatar GamebabyRockSun_QQ

删除目前不用的多余的公共头文件

上级 8c71808f
此差异已折叠。
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//--------------------------------------------------------------------------------------
//
// Functions for loading a DDS texture and creating a Direct3D runtime resource for it
//
// Note these functions are useful as a light-weight runtime loader for DDS files. For
// a full-featured DDS file reader, writer, and texture processing pipeline see
// the 'Texconv' sample and the 'DirectXTex' library.
//
// http://go.microsoft.com/fwlink/?LinkId=248926
// http://go.microsoft.com/fwlink/?LinkId=248929
//--------------------------------------------------------------------------------------
#pragma once
#include <d3d12.h>
#pragma warning(push)
#pragma warning(disable : 4005)
#include <stdint.h>
#pragma warning(pop)
enum DDS_ALPHA_MODE
{
DDS_ALPHA_MODE_UNKNOWN = 0,
DDS_ALPHA_MODE_STRAIGHT = 1,
DDS_ALPHA_MODE_PREMULTIPLIED = 2,
DDS_ALPHA_MODE_OPAQUE = 3,
DDS_ALPHA_MODE_CUSTOM = 4,
};
HRESULT __cdecl CreateDDSTextureFromMemory( _In_ ID3D12Device* d3dDevice,
_In_reads_bytes_(ddsDataSize) const uint8_t* ddsData,
_In_ size_t ddsDataSize,
_In_ size_t maxsize,
_In_ bool forceSRGB,
_Outptr_opt_ ID3D12Resource** texture,
_In_ D3D12_CPU_DESCRIPTOR_HANDLE textureView,
_Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr
);
HRESULT __cdecl CreateDDSTextureFromFile( _In_ ID3D12Device* d3dDevice,
_In_z_ const wchar_t* szFileName,
_In_ size_t maxsize,
_In_ bool forceSRGB,
_Outptr_opt_ ID3D12Resource** texture,
_In_ D3D12_CPU_DESCRIPTOR_HANDLE textureView,
_Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr
);
size_t BitsPerPixel(_In_ DXGI_FORMAT fmt);
//===================================================================================
//项目名称:GRS 公共平台 V2.0
//文件描述:异常类声明 以及异常模块接口定义文件
//模块名称:C/C++全部异常支持模块
//
//组织(公司、集团)名称:One Man Group
//作者:Gamebaby Rock Sun
//日期:2010-5-20 14:29:45
//修订日期:2011-11-21
//===================================================================================
#include "GRS_Win.h"
#include <eh.h>
//如果定义了GRS_EXPORT宏 ,那么使用GRS_DLL定义的类将变成导出类
#ifdef GRSEXCEPTION_EXPORTS
#define GRS_EXPORT
#endif
#include "GRS_DLL.h"
#pragma once
#define GRS_ERRBUF_MAXLEN 1024
//异常类,这个类将是整个类库中唯一的异常类
class GRS_DLL CGRSException
{
enum EM_GRS_EXCEPTION
{//异常的具体种类的枚举值,用于具体区分详细的异常信息
ET_Empty = 0x0,
ET_SE,
ET_LastError,
ET_COM,
ET_Customer
};
protected:
EM_GRS_EXCEPTION m_EType; //异常类型
UINT m_nSEHCode;
DWORD m_dwLastError;
EXCEPTION_POINTERS *m_EP;
TCHAR m_lpErrMsg[GRS_ERRBUF_MAXLEN];
public:
CGRSException& operator = ( CGRSException& ) = delete;
public:
CGRSException()
: m_nSEHCode(0) , m_EP(nullptr),m_dwLastError(0),m_lpErrMsg(),m_EType(ET_Empty)
{
}
//CGRSException(CGRSException& e)
//{
//}
CGRSException( LPCTSTR pszSrcFile, INT iLine, HRESULT hr )
: m_nSEHCode(0), m_EP(nullptr), m_dwLastError(0), m_lpErrMsg(), m_EType(ET_COM)
{
_com_error ce(hr);
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN, _T("%s(%d):发生COM错误0x%X,原因%s")
, pszSrcFile
, iLine
, hr
, ce.ErrorMessage());
}
CGRSException( LPCTSTR pszSrcFile, INT iLine )
:m_nSEHCode(0), m_EP(nullptr), m_dwLastError(0), m_lpErrMsg(), m_EType(ET_LastError)
{
ToString( pszSrcFile, iLine, ::GetLastError() );
}
CGRSException( UINT nCode,EXCEPTION_POINTERS* ep )
:m_nSEHCode(nCode),m_EP(ep),m_dwLastError(0),m_lpErrMsg(),m_EType(ET_SE)
{//结构化异常
//以下开关语句中的常量定义在ntstatus.h中
switch(m_nSEHCode)
{
case 0xC0000029://STATUS_INVALID_UNWIND_TARGET:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("展开(unwind)操作中遭遇无效的展开位置"));
}
break;
case EXCEPTION_ACCESS_VIOLATION:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("线程尝试对虚地址的一次无效访问."));
}
break;
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("线程尝试对有硬件数组边界检查的一次越界访问."));
}
break;
case EXCEPTION_BREAKPOINT:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("遇到断点."));
}
break;
case EXCEPTION_DATATYPE_MISALIGNMENT:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("线程尝试在不支持对齐的硬件上访问未对齐的数据."));
}
break;
case EXCEPTION_FLT_DENORMAL_OPERAND:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("浮点数操作数太小."));
}
break;
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("浮点数被零除."));
}
break;
case EXCEPTION_FLT_INEXACT_RESULT:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("浮点数结果无法被正确描述."));
}
break;
case EXCEPTION_FLT_INVALID_OPERATION:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("未知的浮点数异常."));
}
break;
case EXCEPTION_FLT_OVERFLOW:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("浮点数操作中指数高于指定类型允许的数量级."));
}
break;
case EXCEPTION_FLT_STACK_CHECK:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("浮点数操作中导致的栈溢出."));
}
break;
case EXCEPTION_FLT_UNDERFLOW:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("浮点数操作中指数低于指定类型需要的数量级."));
}
break;
case EXCEPTION_GUARD_PAGE:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("线程访问到被PAGE_GUARD修饰分配的内存."));
}
break;
case EXCEPTION_ILLEGAL_INSTRUCTION:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("线程试图执行不可用指令."));
}
break;
case EXCEPTION_IN_PAGE_ERROR:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("线程试图访问一个系统当前无法载入的缺失页."));
}
break;
case EXCEPTION_INT_DIVIDE_BY_ZERO:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("整数被零除."));
}
break;
case EXCEPTION_INT_OVERFLOW:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("整数操作结果进位超出最高有效位."));
}
break;
case EXCEPTION_INVALID_DISPOSITION:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("异常处理过程返回了一个不可用控点给异常发分发过程."));
}
break;
case EXCEPTION_INVALID_HANDLE:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("线程使用了一个不可用的内核对象句柄(该句柄可能已关闭)."));
}
break;
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("线程试图在不可继续的异常之后继续执行."));
}
break;
case EXCEPTION_PRIV_INSTRUCTION:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("线程试图通过执行一条指令,完成一个不允许在当前计算机模式的操作."));
}
break;
case EXCEPTION_SINGLE_STEP:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("某指令执行完毕信号, 可能来自一个跟踪陷阱或其他单指令机制."));
}
break;
case EXCEPTION_STACK_OVERFLOW:
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN,_T("线程栈空间耗尽."));
}
break;
default://未处理的异常!
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN, _T("CGRSException类未知异常,code=0x%08X"),
m_nSEHCode);
break;
};
}
//CGRSException( LPCTSTR pszSrcFile, INT iLine,DWORD dwLastError )
// :m_nSEHCode(0),m_EP(nullptr),m_dwLastError(dwLastError),m_lpErrMsg(),m_EType(ET_LastError)
//{
// ToString(pszSrcFile,iLine,dwLastError);
//}
//CGRSException( EM_GRS_EXCEPTION EType,LPCTSTR pszFmt,... )
// :m_nSEHCode(0),m_EP(nullptr),m_dwLastError(0),m_lpErrMsg(),m_EType(EType)
//{
// va_list va;
// va_start(va, pszFmt);
// if( nullptr != m_lpErrMsg )
// {
// StringCchVPrintf(m_lpErrMsg,GRS_ERRBUF_MAXLEN,pszFmt,va);
// }
// va_end(va);
//}
CGRSException( LPCTSTR pszFmt , ... )
:m_nSEHCode(0),m_EP(nullptr),m_dwLastError(0),m_lpErrMsg(),m_EType( ET_Customer )
{
va_list va;
va_start(va, pszFmt);
if( nullptr != m_lpErrMsg )
{
StringCchVPrintf(m_lpErrMsg,GRS_ERRBUF_MAXLEN,pszFmt,va);
}
va_end(va);
}
virtual ~CGRSException()
{
}
public:
VOID ToString(LPCTSTR pszSrcFile, INT iLine , DWORD dwErrorCode )
{//工具方法帮助得到一个错误代码的错误信息
//注意因为这个方法申请了对象内部的字符串内存,
//为了能够在对象失效时正常释放所以没有把这个方法设计成静态方法
ZeroMemory(m_lpErrMsg, GRS_ERRBUF_MAXLEN * sizeof(TCHAR));
LPTSTR lpMsgBuf = nullptr;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, nullptr);
size_t szLen = 0;
StringCchLength(lpMsgBuf, GRS_ERRBUF_MAXLEN, &szLen);
if (szLen > 0)
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN, _T("%s(%d):发生错误%d,原因%s")
, pszSrcFile
, iLine
, dwErrorCode
, lpMsgBuf);
LocalFree(lpMsgBuf);
}
else
{
StringCchPrintf(m_lpErrMsg, GRS_ERRBUF_MAXLEN, _T("%s(%d):发生错误%d,原因不明")
, pszSrcFile
, iLine
, dwErrorCode);
}
}
public:
LPCTSTR GetReason() const
{
return m_lpErrMsg;
}
DWORD GetErrCode() const
{
return (0 == m_dwLastError)?m_nSEHCode:m_dwLastError;
}
EM_GRS_EXCEPTION GetType()
{
return m_EType;
}
LPCTSTR GetTypeString()
{
static const TCHAR* pszTypeString[] = {
_T("Empty"),
_T("SE"),
_T("Thread Last Error"),
_T("Customer"),
_T("COM"),
nullptr
};
if( m_EType < sizeof(pszTypeString)/sizeof(pszTypeString[0]))
{
return pszTypeString[m_EType];
}
return nullptr;
}
};
__inline void GRS_SEH_Handle(unsigned int code, struct _EXCEPTION_POINTERS *ep)
{//注意下面的异常抛出方式,这样保证所有的异常在栈上并且是自动对象
throw CGRSException(code,ep);
}
#ifndef GRS_EH_INIT
#define GRS_EH_INIT() _set_se_translator(GRS_SEH_Handle);
#endif // !GRS_EH_INIT
#ifndef GRS_THROW_LASTERROR
#define GRS_THROW_LASTERROR() throw CGRSException(__WFILE__,__LINE__);
#endif // !GRS_THROW_LASTERROR
#ifndef GRS_THROW_COM_ERROR
#define GRS_THROW_COM_ERROR(hr) throw CGRSException(__WFILE__,__LINE__,(hr));
#endif // !GRS_THROW_COM_ERROR
inline void GRSThrowIfFailed(LPCWSTR pszSrcFile,UINT nLine, HRESULT hr)
{
if ( FAILED( hr ) )
{
// 在此行中设置断点,以捕获 Win32 API 错误。
throw CGRSException(pszSrcFile,nLine,hr);
}
}
#define GRS_THROW_IF_FAILED(hr) GRSThrowIfFailed( __WFILE__,__LINE__,(hr) )
\ No newline at end of file
//#include "stdafx.h"
#include "GRSWnd.h"
CGRSWnd::CMapHwndToWnd CGRSWnd::ms_MapWnd;
//===================================================================================
//项目名称:GRS 公共类库 V2.0
//文件描述:Windows窗口基本封装类,主要用于游戏的主窗口界面
//模块名称:Windows窗口
//
//组织(公司、集团)名称:One Man Group
//作者:Gamebaby Rock Sun
//日期:2017-11-21
//===================================================================================
#include "GRS_Win.h"
#include "GRSException.h"
#include "GRSWndUtil.h"
#include "GRSWndMsgProc.h"
#pragma once
#define GRS_DEFAULT_WND_STYLE WS_OVERLAPPED|WS_SYSMENU
#define GRS_DEFAULT_WND_EXSTYLE WS_EX_OVERLAPPEDWINDOW
class CGRSWnd
{
friend class CGRSWndClass;
typedef CAtlMap<HWND, CGRSWnd*> CMapHwndToWnd;
protected:
static CMapHwndToWnd ms_MapWnd;
protected:
HWND m_hWnd;
CGRSWndMsgProc* m_pMsgProc;
public:
CGRSWnd( const CGRSWnd& ) = delete;
CGRSWnd& operator = ( const CGRSWnd& ) = delete;
public:
CGRSWnd()
:m_hWnd(nullptr)
,m_pMsgProc(nullptr)
{
}
CGRSWnd(CGRSWndMsgProc* WndMsgProc
, LPCTSTR pszClassName
, LPCTSTR pszWndName
, int nWidth
, int nHeight
, DWORD dwStyle = GRS_DEFAULT_WND_STYLE
, DWORD dwExStyle = GRS_DEFAULT_WND_EXSTYLE)
:m_hWnd(nullptr)
,m_pMsgProc(WndMsgProc)
{
Create( nWidth, nHeight , pszClassName , pszWndName, dwStyle, dwExStyle);
}
CGRSWnd(CGRSWndMsgProc* WndMsgProc
, LPCTSTR pszClassName
, LPCTSTR pszName
, RECT& rt
, DWORD dwStyle = GRS_DEFAULT_WND_STYLE
, DWORD dwExStyle = GRS_DEFAULT_WND_EXSTYLE)
:m_hWnd(nullptr)
, m_pMsgProc(WndMsgProc)
{
Create(pszClassName,pszName, rt, dwStyle, dwExStyle);
}
CGRSWnd(CGRSWndMsgProc* WndMsgProc)
:m_hWnd(nullptr)
,m_pMsgProc(WndMsgProc)
{
}
virtual ~CGRSWnd()
{
m_pMsgProc = nullptr;
}
public:
BOOL Create(int nWidth , int nHeight , LPCTSTR pszClassName , LPCTSTR pszWndName, DWORD dwStyle, DWORD dwExStyle)
{
return Create(pszClassName, pszWndName, CW_USEDEFAULT, CW_USEDEFAULT, nWidth, nHeight, dwStyle, dwExStyle);
}
BOOL Create( LPCTSTR pszClassName, LPCTSTR pszName, RECT& rt, DWORD dwStyle, DWORD dwExStyle )
{
return Create( pszClassName,pszName, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, dwStyle, dwExStyle );
}
BOOL Create(LPCTSTR pszClassName, LPCTSTR pszName, int x, int y , int nWidth, int nHeight, DWORD dwStyle, DWORD dwExStyle)
{//创建窗口
BOOL bRet = TRUE;
try
{
RECT rtWnd = { 0, 0, static_cast<LONG>(nWidth), static_cast<LONG>(nHeight) };
AdjustWindowRect(&rtWnd, dwStyle, FALSE);
m_hWnd = ::CreateWindowEx( dwExStyle
, pszClassName
, pszName
, dwStyle
, x
, y
, rtWnd.right-rtWnd.left
, rtWnd.bottom-rtWnd.top
, nullptr
, nullptr
, (HINSTANCE)GetModuleHandle(nullptr)
, (LPVOID)this );
if ( nullptr == m_hWnd )
{
GRS_THROW_LASTERROR();
}
}
catch (CGRSException& e)
{
bRet = FALSE;
GRS_TRACE_EXPW( CGRSWnd::Create, e );
}
return bRet;
}
BOOL Destroy()
{
BOOL bRet = TRUE;
try
{
if ( nullptr != m_hWnd )
{
if ( DestroyWindow(m_hWnd) )
{
GRS_THROW_LASTERROR();
}
}
}
catch ( CGRSException& e )
{
bRet = FALSE;
GRS_TRACE_EXPW(CGRSWnd::Destroy, e);
}
return bRet;
}
public:
operator HWND () const
{//类型转换运算符,方便将类作为(HWND)参数传递
return m_hWnd;
}
CGRSWndMsgProc* GetWndProc() const
{
return m_pMsgProc;
}
CGRSWndMsgProc* SetWndProc(CGRSWndMsgProc* pMsgProc)
{
CGRSWndMsgProc* pRetMsgProc = m_pMsgProc;
m_pMsgProc = pMsgProc;
return pRetMsgProc;
}
protected:
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{//窗口过程;
LRESULT lRet = 0;
CGRSWnd* pWnd = nullptr;
try
{
ms_MapWnd.Lookup(hwnd, pWnd);
if ( WM_NCCREATE == uMsg )
{
LPCREATESTRUCT pCS = reinterpret_cast<LPCREATESTRUCT>(lParam);
pWnd = reinterpret_cast<CGRSWnd*>(pCS->lpCreateParams);
GRS_ASSERT( nullptr != pWnd );
ms_MapWnd.SetAt(hwnd, pWnd);
lRet = DefWindowProc(hwnd, uMsg, wParam, lParam);
}
else
{
if (nullptr != pWnd && nullptr != pWnd->m_pMsgProc)
{
lRet = pWnd->m_pMsgProc->WndMsgProc(hwnd, uMsg, wParam, lParam);
if ( 0 > lRet )
{
lRet = DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
else
{
lRet = DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
}
catch (CGRSException& e)
{
GRS_TRACE_EXPW(CGRSWnd::WindowProc, e);
}
return lRet;
}
};
#pragma once
#include "GRS_Win.h"
#include "GRSException.h"
#include "GRSWnd.h"
#define GRS_MAX_CLASSNAME_LEN 256
class CGRSWndClass : public WNDCLASS
{
public:
CGRSWndClass(LPCTSTR pszClassName, WNDPROC wndProc, LPCTSTR pszIcon = nullptr, LPCTSTR pszCursor = nullptr, HINSTANCE hInstance = nullptr)
:WNDCLASS()
{
Register(pszClassName, wndProc, pszIcon, pszCursor, hInstance);
}
CGRSWndClass(LPCTSTR pszClassName, WNDPROC wndProc, WORD nIDIcon, WORD nIDCursor, HINSTANCE hInstance)
:WNDCLASS()
{
Register(pszClassName, wndProc, MAKEINTRESOURCE(nIDIcon), MAKEINTRESOURCE(nIDCursor), hInstance);
}
CGRSWndClass(LPCTSTR pszClassName, LPCTSTR pszIcon = nullptr, LPCTSTR pszCursor = nullptr, HINSTANCE hInstance = nullptr)
:WNDCLASS()
{
Register(pszClassName, CGRSWnd::WindowProc, pszIcon, pszCursor, hInstance);
}
public:
BOOL Register(LPCTSTR pszClassName,WNDPROC wndProc, LPCTSTR pszIcon = nullptr, LPCTSTR pszCursor = nullptr, HINSTANCE hInstance = nullptr)
{
BOOL bRet = TRUE;
try
{
if (nullptr == hInstance)
{
hInstance = (HINSTANCE)GetModuleHandle(nullptr);
}
style = CS_GLOBALCLASS;
lpfnWndProc = wndProc;
hInstance = hInstance;
if (nullptr != pszIcon)
{
hIcon = LoadIcon(hInstance, pszIcon);
}
else
{
hIcon = LoadIcon(0, IDI_APPLICATION);
}
if (nullptr != pszCursor)
{
hCursor = LoadCursor(hInstance, pszCursor);
}
else
{
hCursor = LoadCursor(nullptr, IDC_ARROW);
}
hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
lpszClassName = pszClassName;
ATOM am = ::RegisterClass(this);
if (NULL == am)
{
GRS_THROW_LASTERROR();
}
}
catch (CGRSException& e)
{
bRet = FALSE;
GRS_TRACE_EXPW(CGRSWnd::Register, e);
}
return bRet;
}
};
\ No newline at end of file
#pragma once
#include "GRS_Win.h"
//用于WM_CHAR消息处理LPARAM参数的位域结构体
struct ST_GRS_WMCHAR_LPARAM
{
DWORD m_dwRepCnt : 16; //重复次数
DWORD m_dwScanCode : 8; //键盘扫描码,用于OEM键盘
DWORD m_dwExKey : 1; //是否按下右手的ALT+CTRL键
DWORD m_dwReserved : 4; //保留,永远为0
DWORD m_dwALTKey : 1; //为1 表示ALT键按下
DWORD m_dwPrevKeyState : 1; //为1 表示接到WM_CHAR消息时键是按下的,否则键已弹起
DWORD m_dwKeyReleased : 1; //为1 表示键已释放
};
class CGRSWndMsgProc
{
public:
CGRSWndMsgProc()
{
}
virtual ~CGRSWndMsgProc()
{
}
public:
virtual LRESULT CALLBACK WndMsgProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) = 0;
};
\ No newline at end of file
//===================================================================================
//项目名称:GRS 公共平台 V2.0
//文件描述:DirectX文件再封装头文件,将需要的简单定义也整合到一起
//模块名称:GRSLib V2.0
//
//组织(公司、集团)名称:One Man Group
//作者:Gamebaby Rock Sun
//日期:2017-11-30 14:27:19
//修订日期:2017-11-30
//===================================================================================
#pragma once
//for DirectX Math
#include <DirectXMath.h>
#include <DirectXColors.h>
#include <DirectXCollision.h>
#include <DirectXPackedVector.h>
using namespace DirectX;
//for Direct2D & DirectWrite
#include <d2d1_3.h>
#include <d2d1_3helper.h>
#include <d2d1effects_2.h>
#include <dwrite_3.h>
#include <wincodec.h> //for WIC
//for Shader Compiler
#include <D3Dcompiler.h>
//for Dxgi
//#include <dxgi1_4.h>
#include <dxgi1_6.h>
//for d3d11
#include <d3d11_4.h>
#include <pix.h>
#include <d3d11shader.h>
//#include <d3d11shadertracing.h>
//for d3d12
#include <d3d12.h>
#include <d3d12shader.h>
//Xaudio
#include <Xaudio2.h>
//linker
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dxgi.lib")
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "d3d12.lib")
#pragma comment(lib, "d3dcompiler.lib")
#pragma comment(lib, "d2d1.lib")
#pragma comment(lib, "windowscodecs.lib")
#pragma comment(lib, "dwrite.lib")
#pragma comment(lib, "Xaudio2.lib")
#include "d3dx12.h"
#if defined(_DEBUG)
#include <dxgidebug.h>
#endif
#ifndef D3D_COMPILE_STANDARD_FILE_INCLUDE
#define D3D_COMPILE_STANDARD_FILE_INCLUDE ((ID3DInclude*)(UINT_PTR)1)
#endif
//#include <ppltasks.h> // 对于 create_task
#if defined(_DEBUG)
// 如果项目处于调试生成阶段,请通过 SDK 层启用调试。
#define GRS_OPEN_D3D12_DEBUG() \
{\
ID3D12Debug* pID3D12Debug = nullptr;\
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pID3D12Debug))))\
{\
pID3D12Debug->EnableDebugLayer();\
}\
GRS_SAFE_RELEASE(pID3D12Debug);\
}
#else
#define GRS_OPEN_D3D12_DEBUG()
#endif
#if defined(_DEBUG)
inline void GRS_SetD3D12DebugName(ID3D12Object* pObject, LPCWSTR name)
{
pObject->SetName(name);
}
inline void GRS_SetD3D12DebugNameIndexed( ID3D12Object* pObject, LPCWSTR name, UINT index )
{
WCHAR _DebugName[50] = {};
if ( StringCchPrintfW( _DebugName ,GRS_COUNTOF(_DebugName), L"%s[%u]", name, index ) )
{
pObject->SetName( _DebugName );
}
}
#else
inline void GRS_SetD3D12DebugName(ID3D12Object*, LPCWSTR)
{
}
inline void GRS_SetD3D12DebugNameIndexed(ID3D12Object*, LPCWSTR, UINT)
{
}
#endif
#define GRS_SET__D3D12_DEBUGNAME(x) GRS_SetD3D12DebugName(x, L#x)
#define GRS_SET__D3D12_DEBUGNAME_INDEXED(x, n) GRS_SetD3D12DebugNameIndexed(x[n], L#x, n)
#define GRS_SET__D3D12_DEBUGNAME_COMPTR(x) GRS_SetD3D12DebugName(x.Get(), L#x)
#define GRS_SET__D3D12_DEBUGNAME_INDEXED_COMPTR(x, n) GRS_SetD3D12DebugNameIndexed(x[n].Get(), L#x, n)
#if defined(_DEBUG)
inline void GRS_SetDXGIDebugName(IDXGIObject* pObject, LPCWSTR name)
{
size_t szLen = 0;
StringCchLengthW(name, 50, &szLen);
pObject->SetPrivateData(WKPDID_D3DDebugObjectName, static_cast<UINT>(szLen - 1), name);
}
inline void GRS_SetDXGIDebugNameIndexed(IDXGIObject* pObject, LPCWSTR name, UINT index)
{
size_t szLen = 0;
WCHAR _DebugName[50] = {};
if (StringCchPrintfW(_DebugName, GRS_COUNTOF(_DebugName), L"%s[%u]", name, index))
{
StringCchLengthW(_DebugName, 50, &szLen);
pObject->SetPrivateData(WKPDID_D3DDebugObjectName, static_cast<UINT>(szLen),_DebugName);
}
}
#else
inline void GRS_SetDXGIDebugName(ID3D12Object*, LPCWSTR)
{
}
inline void GRS_SetDXGIDebugNameIndexed(ID3D12Object*, LPCWSTR, UINT)
{
}
#endif
#define GRS_SET__DXGI_DEBUGNAME(x) GRS_SetDXGIDebugName(x, L#x)
#define GRS_SET__DXGI_DEBUGNAME_INDEXED(x, n) GRS_SetDXGIDebugNameIndexed(x[n], L#x, n)
#define GRS_SET__DXGI_DEBUGNAME_COMPTR(x) GRS_SetDXGIDebugName(x.Get(), L#x)
#define GRS_SET__DXGI_DEBUGNAME_INDEXED_COMPTR(x, n) GRS_SetDXGIDebugNameIndexed(x[n].Get(), L#x, n)
#if defined(PROFILE) || defined(DEBUG)
GRS_INLINE void GRS_SetD3D11DebugName(IDXGIObject* pObj, const CHAR* pstrName)
{
if (pObj)
{
pObj->SetPrivateData(WKPDID_D3DDebugObjectName, lstrlenA(pstrName), pstrName);
}
}
GRS_INLINE void GRS_SetD3D11DebugName(ID3D11Device* pObj, const CHAR* pstrName)
{
if (pObj)
{
pObj->SetPrivateData(WKPDID_D3DDebugObjectName, lstrlenA(pstrName), pstrName);
}
}
GRS_INLINE void GRS_SetD3D11DebugName(ID3D11DeviceChild* pObj, const CHAR* pstrName)
{
if (pObj)
{
pObj->SetPrivateData(WKPDID_D3DDebugObjectName, lstrlenA(pstrName), pstrName);
}
}
#else
#define GRS_SetD3D11DebugName( pObj, pstrName )
#endif
//为可靠的时间戳查询设置稳定的电源状态。
//if (debugLayerEnabled)
//{
// // Set stable power state for reliable timestamp queries.
// ThrowIfFailed(m_devices[i]->SetStablePowerState(TRUE));
//}
//#if defined(_DEBUG)
//// 请检查 SDK 层支持。
//inline bool SdkLayersAvailable()
//{
// HRESULT hr = D3D11CreateDevice(
// nullptr,
// D3D_DRIVER_TYPE_NULL, // 无需创建实际硬件设备。
// 0,
// D3D11_CREATE_DEVICE_DEBUG, // 请检查 SDK 层。
// nullptr, // 任何功能级别都会这样。
// 0,
// D3D11_SDK_VERSION, // 对于 Windows 应用商店应用,始终将此值设置为 D3D11_SDK_VERSION。
// nullptr, // 无需保留 D3D 设备引用。
// nullptr, // 无需知道功能级别。
// nullptr // 无需保留 D3D 设备上下文引用。
// );
//
// return SUCCEEDED(hr);
//}
//#endif
//===================================================================================
//项目名称:GRS 公共平台 V2.0
//文件描述:每个动态库都要使用的标准头文件 动态库中包含时 预定义GRS_EXPORT宏
//
//模块名称:DLL支持模块
//
//组织(公司、集团)名称:One Man Group
//作者:Gamebaby Rock Sun
//日期:2009-11-18 10:18:15
//修订日期:2017-11-21
//
//特别注意:该文件没有 #pragma once 定义,也就是该文件会被反复包含,
//这是一个特意而为的设计,千万不要修正,否则很多DLL无法正常编译
//===================================================================================
//取消GRS_DLL的定义
#ifdef GRS_DLL
#undef GRS_DLL
#endif
//-----------------------------------------------------------------------------------
//注意这个文件中没有使用防止重新宏包含的特性,主要是为了方便在多个不同的模块中,
//利用重定义GRS_EXPORT宏的方式灵活的定义导出 导入的情形
//-----------------------------------------------------------------------------------
#if defined GRS_EXPORT
#define GRS_DLL __declspec( dllexport )
#else
#define GRS_DLL __declspec( dllimport )
#endif
#pragma message(" " __DATE__ " " __TIME__ ":使用GRS_DLL = " GRS_STRING(GRS_DLL)" 编译文件......" )
#if defined GRS_EXPORT
#pragma message(" " __DATE__ " " __TIME__ ":已取消GRS_EXPORT宏的定义" )
#undef GRS_EXPORT
#endif
\ No newline at end of file
#pragma once
typedef double GRS_DOUBLE;
//===================================================================================
//项目名称:GRS 公共平台 V2.0
//文件描述:Windows头文件再封装头文件,将需要的简单Windows定义也整合到一起
//模块名称:GRSLib V2.0
//
//组织(公司、集团)名称:One Man Group
//作者:Gamebaby Rock Sun
//日期:2010-5-20 14:27:19
//修订日期:2017-11-25
//===================================================================================
#pragma once
//设置简体中文为默认代码页
#pragma setlocale("chinese-simplified")
#include <SDKDDKVer.h>
#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
#include <windows.h>
#include <tchar.h>
#include <process.h> //for _beginthread, _endthread
#include <locale.h>
//Winsock & Net API
#include <winsock2.h>
#include <ws2ipdef.h>
#include <windns.h>
#include <iphlpapi.h>
#include <MSWSOCK.h>
//添加WTL支持 方便使用COM
#include <wrl.h>
using namespace Microsoft;
using namespace Microsoft::WRL;
#include <shellapi.h>
//#include <winerror.h> //for downlist code
//#ifndef __midl
//FORCEINLINE _Translates_Win32_to_HRESULT_(x) HRESULT HRESULT_FROM_WIN32(unsigned long x) { return (HRESULT)(x) <= 0 ? (HRESULT)(x) : (HRESULT)(((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000); }
//#else
//#define HRESULT_FROM_WIN32(x) __HRESULT_FROM_WIN32(x)
//#endif
#pragma comment( lib, "Ws2_32.lib" )
#pragma comment( lib, "Iphlpapi.lib")
#pragma comment( lib, "Mswsock.lib" )
//COM Support
#include <comutil.h>
#include <comip.h> //for _com_ptr_t
#include <comdef.h> //for _com_error
#ifdef _DEBUG
#pragma comment (lib,"comsuppwd.lib")
#else
#pragma comment (lib,"comsuppw.lib")
#endif
//使用系统安全字符串函数支持
#include <strsafe.h>
//使用ATL的字符集转换支持
#include <atlconv.h>
//使用ATL集合类
#include <atlcoll.h>
using namespace ATL;
//XML功能支持
#include <msxml6.h>
#pragma comment (lib,"msxml6.lib")
//另外一种方法,直接导入DLL中的类型信息,需要时自行还原下列注释
//#import "msxml6.dll"
//using namespace MSXML2;
//IXMLDOMParseError* pXMLErr = nullptr;
//IXMLDOMDocument* pXMLDoc = nullptr;
//
//hr = pXMLDoc->loadXML(pXMLString, &bSuccess);
//
//GRS_SAFEFREE(pXMLData);
//
//if (VARIANT_TRUE != bSuccess || FAILED(hr))
//{
// pXMLDoc->get_parseError(&pXMLErr);
// ReportDocErr(argv[1], pXMLErr);
//}
//VOID ReportDocErr(LPCTSTR pszXMLFileName, IXMLDOMParseError* pIDocErr)
//{
// GRS_USEPRINTF();
// long lLine = 0;
// long lCol = 0;
// LONG lErrCode = 0;
// BSTR bstrReason = nullptr;
//
// pIDocErr->get_line(&lLine);
// pIDocErr->get_linepos(&lCol);
// pIDocErr->get_reason(&bstrReason);
//
// GRS_PRINTF(_T("XML文档\"%s\"中(行:%ld,列:%ld)处出现错误(0x%08x),原因:%s\n")
// , pszXMLFileName, lLine, lCol, lErrCode, bstrReason);
//
// SysFreeString(bstrReason);
//
//}
//===================================================================================
//Debug 支持相关宏定义
//用于输出编译信息时,将其他类型的信息变成字符串型的
#ifndef GRS_STRING2
#define GRS_STRING2(x) #x
#endif // !GRS_STRING2
#ifndef GRS_STRING
#define GRS_STRING(x) GRS_STRING2(x)
#endif // !GRS_STRING
#ifndef GRS_WSTRING2
#define GRS_WSTRING2(x) L #x
#endif // !GRS_WSTRING2
#ifndef GRS_WSTRING
#define GRS_WSTRING(x) GRS_WSTRING2(x)
#endif // !GRS_WSTRING
#ifndef GRS_WIDEN2
#define GRS_WIDEN2(x) L ## x
#endif // !GRS_WIDEN2
#ifndef GRS_WIDEN
#define GRS_WIDEN(x) GRS_WIDEN2(x)
#endif // !GRS_WIDEN
#ifndef __WFILE__
#define __WFILE__ GRS_WIDEN(__FILE__)
#endif // !GRS_WIDEN
#ifndef GRS_DBGOUT_BUF_LEN
#define GRS_DBGOUT_BUF_LEN 2048
#endif
//断言定义(从GRS_Def.h文件移至这里)
#ifdef _DEBUG
#define GRS_ASSERT(s) if(!(s)) { ::DebugBreak(); }
#else
#define GRS_ASSERT(s)
#endif
__inline void __cdecl GRSDebugOutputA(LPCSTR pszFormat, ...)
{//UNICODE版的待时间的Trace
va_list va;
va_start(va, pszFormat);
CHAR pBuffer[GRS_DBGOUT_BUF_LEN] = {};
if (S_OK != ::StringCchVPrintfA(pBuffer, sizeof(pBuffer) / sizeof(pBuffer[0]), pszFormat, va))
{
va_end(va);
return;
}
va_end(va);
OutputDebugStringA(pBuffer);
}
__inline void __cdecl GRSDebugOutputW(LPCWSTR pszFormat, ...)
{//UNICODE版的待时间的Trace
va_list va;
va_start(va, pszFormat);
WCHAR pBuffer[GRS_DBGOUT_BUF_LEN] = {};
if (S_OK != ::StringCchVPrintfW(pBuffer, sizeof(pBuffer) / sizeof(pBuffer[0]), pszFormat, va))
{
va_end(va);
return;
}
va_end(va);
OutputDebugStringW(pBuffer);
}
#ifdef UNICODE
#define GRSDebugOutput GRSDebugOutputW
#else
#define GRSDebugOutput GRSDebugOutputA
#endif
//普通的调试输出支持
#if defined(DEBUG) | defined(_DEBUG)
#define GRS_TRACE(...) GRSDebugOutput(__VA_ARGS__)
#define GRS_TRACEA(...) GRSDebugOutputA(__VA_ARGS__)
#define GRS_TRACEW(...) GRSDebugOutputW(__VA_ARGS__)
#define GRS_TRACE_LINE() GRSDebugOutputA("%s(%d):",__FILE__, __LINE__)
#else
#define GRS_TRACE(...)
#define GRS_TRACEA(...)
#define GRS_TRACEW(...)
#define GRS_TRACE_LINE()
#endif
#define GRS_TRACE_ON1
#if defined(GRS_DBGOUT_ON1)
#define GRS_TRACE1(...) GRSDebugOutput(__VA_ARGS__)
#define GRS_TRACEA1(...) GRSDebugOutputA(__VA_ARGS__)
#define GRS_TRACEW1(...) GRSDebugOutputW(__VA_ARGS__)
#define GRS_TRACE_LINE1() GRSDebugOutputA("%s(%d):",__FILE__, __LINE__)
#else
#define GRS_TRACE1(...)
#define GRS_TRACEA1(...)
#define GRS_TRACEW1(...)
#define GRS_TRACE_LINE1()
#endif
//输出异常CGRSException
#if defined(DEBUG) | defined(_DEBUG)
#define GRS_TRACE_EXPW(Fun,e) \
GRSDebugOutputW(L"%s(%d):%s函数捕获异常(0x%08X):%s\n"\
,__WFILE__\
,__LINE__\
,L#Fun\
,(e).GetErrCode()\
,(e).GetReason())
#else
#define GRS_TRACE_EXPW(Fun,e)
#endif
//===================================================================================
//===================================================================================
//警告宏,用于检测运行时设置参数是否正确
#if defined(DEBUG) | defined(_DEBUG)
#define GRS_WARNING_IF(isTrue, ... )\
{ \
static bool s_TriggeredWarning = false; \
if ((bool)(isTrue) && !s_TriggeredWarning)\
{ \
s_TriggeredWarning = true; \
GRSDebugOutputW(L"%s(%d)中出现判定警告(条件\'%s\'为真):%s\n"\
,__WFILE__\
,__LINE__\
,GRS_WSTRING(isTrue)\
,__VA_ARGS__);\
} \
}
#define GRS_WARNING_IF_NOT( isTrue, ... ) GRS_WARNING_IF(!(isTrue), __VA_ARGS__)
#else
#define GRS_WARNING_IF( isTrue, ... )
#define GRS_WARNING_IF_NOT( isTrue, ... )
#endif
//===================================================================================
//===================================================================================
//仿C 内存管理库函数 宏定义 直接调用相应WinAPI 提高效率
#ifndef GRS_ALLOC
#define GRS_ALLOC(sz) HeapAlloc(GetProcessHeap(),0,sz)
#endif // !GRS_ALLOC
#ifndef GRS_CALLOC
#define GRS_CALLOC(sz) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sz)
#endif // !GRS_CALLOC
#ifndef GRS_REALLOC
#define GRS_REALLOC(p,sz) HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,p,sz)
#endif // !GRS_REALLOC
#ifndef GRS_FREE
#define GRS_FREE(p) HeapFree(GetProcessHeap(),0,p)
#endif // !GRS_FREE
#ifndef GRS_MSIZE
#define GRS_MSIZE(p) HeapSize(GetProcessHeap(),0,p)
#endif // !GRS_MSIZE
#ifndef GRS_MVALID
#define GRS_MVALID(p) HeapValidate(GetProcessHeap(),0,p)
#endif // !GRS_MVALID
#ifndef GRS_SAFEFREE
//下面这个表达式可能会引起副作用,p参数尽量使用指针变量,而不是表达式
#define GRS_SAFE_FREE(p) if( nullptr != (p) ){ HeapFree(GetProcessHeap(),0,(p));(p)=nullptr; }
#endif // !GRS_SAFEFREE
#ifndef GRS_SAFE_DELETE
//下面这个表达式可能会引起副作用,p参数尽量使用指针变量,而不是表达式
#define GRS_SAFE_DELETE(p) if( nullptr != (p) ){ delete p; (p) = nullptr; }
#endif // !GRS_SAFEFREE
#ifndef GRS_SAFE_DELETE_ARRAY
//下面这个表达式可能会引起副作用,p参数尽量使用指针变量,而不是表达式
#define GRS_SAFE_DELETE_ARRAY(p) if( nullptr != (p) ){ delete[] p; (p) = nullptr; }
#endif // !GRS_SAFEFREE
#ifndef GRS_OPEN_HEAP_LFH
//下面这个宏用于打开堆的LFH特性,以提高性能
#define GRS_OPEN_HEAP_LFH(h) \
ULONG ulLFH = 2;\
HeapSetInformation((h),HeapCompatibilityInformation,&ulLFH ,sizeof(ULONG) ) ;
#endif // !GRS_OPEN_HEAP_LFH
//===================================================================================
//===================================================================================
//常用的宏定义 统一收集在这里
#ifndef GRS_NOVTABLE
#define GRS_NOVTABLE __declspec(novtable)
#endif // !GRS_NOVTABLE
#ifndef GRS_TLS
//TLS 存储支持
#define GRS_TLS __declspec( thread )
#endif // !GRS_TLS
//内联定义
#ifndef GRS_INLINE
#define GRS_INLINE __inline
#endif
#ifndef GRS_FORCEINLINE
#define GRS_FORCEINLINE __forceinline
#endif
#ifndef GRS_NOVTABLE
#define GRS_NOVTABLE __declspec(novtable)
#endif
#ifndef GRS_CDECL
#define GRS_CDECL __cdecl
#endif
#ifndef GRS_STDCL
#define GRS_STDCL __stdcall
#endif
#ifndef GRS_FASTCL
#define GRS_FASTCL __fastcall
#endif
#ifndef GRS_PASCAL
#define GRS_PASCAL __pascal
#endif
//取静态数组元素的个数
#ifndef GRS_COUNTOF
#define GRS_COUNTOF(a) sizeof(a)/sizeof(a[0])
#endif
//将除法结果向上取整,如3/2 = 2
#ifndef GRS_UPDIV
#define GRS_UPDIV(a,b) ((a) + (b) - 1)/(b)
#endif
//将a对齐到b的整数倍
#ifndef GRS_UPROUND
#define GRS_UPROUND(x,y) (((x)+((y)-1))&~((y)-1))
#endif
//将a增大对齐到4K的最小整数倍
#ifndef GRS_UPROUND4K
#define GRS_UPROUND4K(a) GRS_UPROUND(a,4096)
#endif
//不使用的参数
#ifndef GRS_UNUSE
#define GRS_UNUSE(a) a;
#endif
#ifndef GRS_SLEEP
//利用等待线程句柄自己精确延时一定的毫秒数,用于替代不精确的系统函数Sleep
#define GRS_SLEEP(dwMilliseconds) WaitForSingleObject(GetCurrentThread(),dwMilliseconds)
#endif // !GRS_SLEEP
#ifndef GRS_FOREVERLOOP
//《代码大全》中建议的死循环宏定义
#define GRS_FOREVERLOOP for(;;)
#endif // !GRS_FOREVERLOOP
//复制句柄的宏定义
#ifndef GRS_DUPHANDLE
//复制一个句柄,继承标志关闭
#define GRS_DUPHANDLE(h,hDup) DuplicateHandle(GetCurrentProcess(),(h),GetCurrentProcess(),&(hDup),0,FALSE,DUPLICATE_SAME_ACCESS)
#endif // !GRS_DUPHANDLE
#ifndef GRS_DUPHANDLEI
//复制一个句柄,继承标志打开
#define GRS_DUPHANDLEI(h,hDup) DuplicateHandle(GetCurrentProcess(),(h),GetCurrentProcess(),&(hDup),0,TRUE,DUPLICATE_SAME_ACCESS)
#endif // !GRS_DUPHANDLEI
#ifndef GRS_SETHANDLE_NI
//将一个句柄设置为不能继承
#define GRS_SETHANDLE_NI(h) SetHandleInformation(h,HANDLE_FLAG_INHERIT,0)
#endif // !GRS_SETHANDLE_NI
#ifndef GRS_SETHANDLE_NC
//将一个句柄设置为不能用CloseHandle关闭
#define GRS_SETHANDLE_NC(h) SetHandleInformation(h,HANDLE_FLAG_PROTECT_FROM_CLOSE,HANDLE_FLAG_PROTECT_FROM_CLOSE)
#endif // !GRS_SETHANDLE_NC
#ifndef GRS_SETHANDLE_I
//将一个句柄设置为能继承
#define GRS_SETHANDLE_I(h) SetHandleInformation(h,HANDLE_FLAG_INHERIT,HANDLE_FLAG_INHERIT)
#endif // !GRS_SETHANDLE_I
#ifndef GRS_SETHANDLE_C
//将一个句柄设置为能够用CloseHandle关闭
#define GRS_SETHANDLE_C(h) SetHandleInformation(h,HANDLE_FLAG_PROTECT_FROM_CLOSE,0)
#endif // !GRS_SETHANDLE_C
#ifndef GRS_SAFE_CLOSEHANDLE
//安全关闭一个句柄
#define GRS_SAFE_CLOSEHANDLE(h) if(nullptr != (h)){CloseHandle(h);(h)=nullptr;}
#endif // !GRS_SAFE_CLOSEHANDLE
#ifndef GRS_SAFE_CLOSEFILE
//安全关闭一个文件句柄
#define GRS_SAFE_CLOSEFILE(h) if(INVALID_HANDLE_VALUE != (h)){CloseHandle(h);(h)=INVALID_HANDLE_VALUE;}
#endif // !GRS_SAFE_CLOSEFILE
//=======================================结束========================================
//===================================================================================
//注意DEBUG版的GRS_SAFE_RELEASE要求最后Release的时候计数为0,只是为了调试方便
//根据不同COM接口内部计数器实现的不一样,因此并不是所有的接口在释放时返回的计数都是0
//这个断言只有提醒之意,具体代码要具体分析,感觉使用不方便时,请注释那个GRS_ASSERT
#ifndef GRS_SAFE_RELEASE
#define GRS_SAFE_RELEASE(I) \
if(nullptr != (I))\
{\
ULONG ulRefCnt = (I)->Release();\
(I) = nullptr;\
}
#endif // !GRS_SAFE_RELEASE
#ifndef GRS_SAFE_RELEASE_ASSERT
#define GRS_SAFE_RELEASE_ASSERT(I) \
if(nullptr != (I))\
{\
ULONG ulRefCnt = (I)->Release();\
GRS_ASSERT(0 == ulRefCnt);\
(I) = nullptr;\
}
#endif // !GRS_SAFE_RELEASE_ASSERT
//===================================================================================
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册