📄 mycmnhdr.h
字号:
}
// myASSERT 宏
#ifdef _DEBUG
#define myASSERT(X) if ( ! ( X ) ) ASSERTFAIL ( __FILE__ , __LINE__ , #X )
#else
#define myASSERT(X)
#endif
// myVERIFY 宏
#ifdef _DEBUG
#define myVERIFY(X) myASSERT(X)
#else
#define myVERIFY(X) (X)
#endif
/////////////////////////// SETDLGICONS 宏 ////////////////////////////////////
// 设置对话框图标 宏
// 注意:此宏只能用在VC.net中,_MSC_VER 编译器版本宏,1300代表VC.net
#if ( _MSC_VER >= 1300 )
#pragma warning ( disable : 4312 )
inline void SETDLGICONS ( HWND hWnd , int iID )
{
SendMessage ( hWnd , WM_SETICON , TRUE ,
( LPARAM ) LoadIcon ( ( HINSTANCE ) GetWindowLongPtr ( hWnd , GWLP_HINSTANCE ) ,
MAKEINTRESOURCE ( iID ) ) ) ;
SendMessage ( hWnd , WM_SETICON , FALSE ,
( LPARAM ) LoadIcon ( ( HINSTANCE ) GetWindowLongPtr ( hWnd , GWLP_HINSTANCE ) ,
MAKEINTRESOURCE ( iID ) ) ) ;
}
#pragma warning ( default : 4312 )
#endif
/////////////////////////// UNICODECHECK 宏 ///////////////////////////////////
// 如果在不支持 UNICODE 的系统中编译 Unicode 编码的程序,则打印错误并退出程序
#ifdef UNICODE
class CUnicodeSupported {
public:
CUnicodeSupported ()
{
if ( GetWindowsDirectoryW ( NULL , 0 ) <= 0 )
{
MsgBox ( _TEXT ( "程序不能在不支持 Unicode 的系统中运行" ) ) ;
ExitProcess ( 0 ) ;
}
}
} ;
// 使用静态的全局对象就不用在自己的程序中添加额外的代码,程序启动时会自动调用
// 对象的构造函数
// 如果探测到系统完全支持 Unicode 构造函数返回而程序继续执行
// 对于非 Unicode 的程序建立,也不需要实例化上述 C++ 类,程序只管运行就是
static CUnicodeSupported g_UnicodeSupported ;
#endif
////////////////////// 强制链接程序寻找 WinMain 进入点函数 ////////////////////
// 用法中文介绍参见:VC 6 预处理器参考手册 58 页 Linker
#pragma comment ( linker , "/subsystem:Windows" )
/////////////////////////////// 常用宏介绍 ////////////////////////////////////
// 得到文件最后修改日期 宏
// _MSC_VER 编译器版本宏 。 e.g. 1300 代表 VC.net ; 1200 代表 VC 6.0
// _MFC_VER Microsoft Founndation 类库 版本号 类库 0x0700 代表 Version 7
// 类库 4.21 定义为 0x0421,它总是定义的
// __DATE__ 当前文件编译日期
// __FILE__ 当前文件名
// __LINE__ 当前行号
// __TIME__ 最后一次编译时间
// __TIMESTAMP__ 最后一次修改日期
// _ATL_VER ATL 版本号
// _DEBUG Debug 版本
// _DLL 指定 /MD or /MDd (Multithread DLL) 方式编译
// __M_ALPHA 为 DEC ALPHA 平台定义,使用ALPHA编译器时定义为1,否则不定义
// __M_IX86 为 x86 处理器定义
// __M_MPPC 为 Power Macintosh 平台定义,缺省为 601( /QP601 )
// __M_MRX000 为 MIPS 平台定义,缺省为 4000( /QMR4000 )
// __M_PPC 为 PowerPC 平台定义,缺省为 604( /QP604 )
// __MT 当指定 /MD 或 /MDd ( 多线程DLL ) 或 /MT 或 /MTd ( 多线程 ) 选项时定义
// 详情请参:MSDN
// MSDN2003 VS.net 地址:ms-help://MS.MSDNQTR.2003FEB.2052/vclang/html/_PREDIR_Predefined_Macros.htm
// 中文参考:VC 6 预处理器参考手册 44 页
/////////////////////////////// INRANDOM 宏 ///////////////////////////////////
// 产生规定范围内的随机数
// 如果需要真正的随机数,只需要设定随机因子,如下:
// #include <time.h> // for time ( 0 )
// #include <stdlib.h> // for srand ( )
// srand ( time ( 0 ) ) ;
#define INRANDOM( min , max ) ( ( rand() % ( int ) ( ( ( max ) + 1 ) - ( min ) ) ) + ( min ) )
/*
const int INRANDOM ( int min , int max )
{
return ( ( rand () % ( ( max + 1 ) - min ) ) + min ) ;
}
*/
/////////////////////////////// CTimer 类 /////////////////////////////////////
// 计算时间间隔
// 使用举例:( 计算 Sleep 延时 1000 ms 的精确时间 )
// CTimer time ;
// Sleep ( 1000 ) ;
// double timer = time.End () ;
#ifdef _MY_TIME
class CTimer
{
public:
inline CTimer( void )
{
QueryPerformanceFrequency(&m_Frequency);
QueryPerformanceCounter(&m_StartCount);
}
inline double End( void ) const
{
LARGE_INTEGER CurrentCount;
QueryPerformanceCounter(&CurrentCount);
return double(CurrentCount.LowPart - m_StartCount.LowPart) / (double)m_Frequency.LowPart;
}
inline void Reset( void )
{
QueryPerformanceCounter(&m_StartCount);
}
private:
LARGE_INTEGER m_Frequency;
LARGE_INTEGER m_StartCount;
};
#endif
/////////////////////////// FormatErrMsg //////////////////////////////////////
// 格式化错误消息,消息号为 GetLastError () 返回的消息号
inline PTSTR FormatErrMsg ( DWORD dwErrorCode )
{
// 错误消息句柄缓存
HLOCAL hlocal = NULL ;
// 得到消息号的原文描述
BOOL fOK = FormatMessage ( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER ,
NULL , dwErrorCode , MAKELANGID ( LANG_ENGLISH , SUBLANG_ENGLISH_US ) ,
( PTSTR ) & hlocal , 0 , NULL ) ;
if( !fOK )
{
// 如果得到消息号的原文描述出错,则分析是否与网络有关 ( network )
HMODULE hDll = LoadLibraryEx ( TEXT ( "netmsg.dll" ) , NULL ,
DONT_RESOLVE_DLL_REFERENCES ) ;
if( hDll != NULL )
{
FormatMessage ( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM ,
hDll , dwErrorCode , MAKELANGID ( LANG_ENGLISH , SUBLANG_ENGLISH_US ) ,
( PTSTR ) & hlocal , 0 , NULL ) ;
FreeLibrary ( hDll ) ;
}
else
{
return ( TEXT ( "netmsg.dll found not" ) ) ;
}
}
if( hlocal != NULL )
{
return ( LPTSTR ) LocalLock ( hlocal ) ;
}
else
{
return ( TEXT ( "Error number not found" ) ) ;
}
return ( PTSTR ) LocalLock ( hlocal ) ;
}
#define FORMATERRMSG FormatErrMsg ( GetLastError () )
/////////////////////////// 改变程序权限 //////////////////////////////////////
// 获得调试权限
/*
* 函数名称:bool EnablePrivilege(LPCTSTR lpszPrivilegeName,bool bEnable)
* 函数类型:bool
* 参数说明:lpszPrivilegeName,特权级别
* bEnable,是否获得特权。TRUE---获得、FALSE---取消
* 功 能:获得进程的权限(特权)
* 说 明:系统默认有下列特权:
* SE_ASSIGNPRIMARYTOKEN_NAME
* SE_AUDIT_NAME
* SE_BACKUP_NAME
* SE_CHANGE_NOTIFY_NAME
* SE_CREATE_PAGEFILE_NAME
* SE_CREATE_PERMANENT_NAME
* SE_CREATE_TOKEN_NAME
* SE_DEBUG_NAME
* SE_INC_BASE_PRIORITY_NAME
* SE_INCREASE_QUOTA_NAME
* SE_LOAD_DRIVER_NAME
* SE_LOCK_MEMORY_NAME
* SE_PROF_SINGLE_PROCESS_NAME
* SE_RESTORE_NAME
* SE_SECURITY_NAME
* SE_SHUTDOWN_NAME
* SE_SYSTEM_ENVIRONMENT_NAME
* SE_SYSTEM_PROFILE_NAME
* SE_SYSTEMTIME_NAME
* SE_TAKE_OWNERSHIP_NAME
* SE_TCB_NAME
* SE_UNDOCK_NAME
* MSDN关键字:SE_DEBUG_NAME
*/
inline bool EnablePrivilege( LPCTSTR lpszPrivilegeName , bool bEnable)
{
HANDLE hToken ;
TOKEN_PRIVILEGES tp ;
LUID luid ;
if( ! OpenProcessToken( GetCurrentProcess() , TOKEN_ADJUST_PRIVILEGES |
TOKEN_QUERY | TOKEN_READ,&hToken ) )
{
return FALSE ;
}
if( ! LookupPrivilegeValue( NULL , lpszPrivilegeName , &luid ) )
{
return TRUE ;
}
tp.PrivilegeCount = 1 ;
tp.Privileges[0].Luid = luid ;
tp.Privileges[0].Attributes = ( bEnable ) ? SE_PRIVILEGE_ENABLED : 0 ;
AdjustTokenPrivileges( hToken , FALSE , &tp , NULL , NULL , NULL ) ;
CloseHandle( hToken ) ;
return ( GetLastError() == ERROR_SUCCESS ) ;
}
//////////////////////////////// MAX3 /////////////////////////////////////////
// 求三个数中的最大数
// #define MAX3 ( a , b , c ) ( ( a > b ? a : b ) > c ? ( a > b ? a : b ) : c )
inline float MAX3 ( float a , float b , float c )
{
return ( ( a > b ? a : b ) > c ? ( a > b ? a : b ) : c ) ;
}
inline int MAX3 ( int a , int b , int c )
{
return ( ( a > b ? a : b ) > c ? ( a > b ? a : b ) : c ) ;
}
inline double MAX3 ( double a , double b , double c )
{
return ( ( a > b ? a : b ) > c ? ( a > b ? a : b ) : c ) ;
}
//////////////////////////////// MIN3 /////////////////////////////////////////
// 求三个数中的最小数
// #define MIN3 ( a , b , c ) ( ( a < b ? a : b ) < c ? ( a < b ? a : b ) : c )
inline float MIN3 ( float a , float b , float c )
{
return ( ( a < b ? a : b ) < c ? ( a < b ? a : b ) : c ) ;
}
inline int MIN3 ( int a , int b , int c )
{
return ( ( a < b ? a : b ) < c ? ( a < b ? a : b ) : c ) ;
}
inline double MIN3 ( double a , double b , double c )
{
return ( ( a < b ? a : b ) < c ? ( a < b ? a : b ) : c ) ;
}
/////////////////////////// 文件到此结束 //////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -