- GetVersionEx
[GetVersionEx可能被修改或无法在windows8.1之后发布。相反,使用Version Helper函数]
随着Windows 8.1的发布,GetVersionEx API的行为在它将返回操作系统版本的值中发生了变化。GetVersionEx函数返回的值现在取决于应用程序的表示方式。
Windows 8.1或Windows 10中未显示的应用程序将返回Windows 8 OS版本值(6.2)。一旦应用程序显示为给定的操作系统版本,GetVersionEx将始终返回应用程序显示为未来版本的版本。要为windows8.1或windows10显示您的应用程序,请参阅针对Windows的应用程序。
确定当前操作系统通常不是确定某个操作系统特性是否存在的最佳方法。这是因为操作系统可能在可重新发布的DLL中添加了新特性。与其使用GetVersionEx来确定操作系统平台或版本号,不如测试该特性本身的存在性。有关更多信息,请参阅操作系统版本。
GetSystemMetrics函数提供关于当前操作系统的附加信息。
要检查特定的操作系统或操作系统特性,请使用IsOS函数。GetProductInfo函数检索产品类型。
要检索远程计算机上操作系统的信息,请使用NetWkstaGetInfo函数、Win32_OperatingSystem WMI类或IADsComputer接口的OperatingSystem属性。
要将当前系统版本与所需版本进行比较,请使用VerifyVersionInfo函数,而不是使用GetVersionEx自己执行比较。
如果兼容模式有效,GetVersionEx函数将报告其标识的操作系统(可能不是安装的操作系统)。例如,如果兼容模式有效,GetVersionEx将报告为应用程序兼容性选择的操作系统。
https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getversionexa
https://docs.microsoft.com/zh-cn/windows/desktop/SysInfo/version-helper-apis
- 单例
template<class T>
class CSingleObject
{
public:
CSingleObject () {T::CreateInstance();}
~CSingleObject () {T::DeleteInstance();}
T* GetPointer () {return T::GetThis();}
T& GetObject () {return T::GetInstance();}
BOOL IsValid () {return GetPointer() != nullptr;}
};
Singleton.h中宏感觉挺有意思的:
#define SINGLETON_THIS(ClassName) ClassName::GetThis()
#define SINGLETON_INSTANCE(ClassName) ClassName::GetInstance()
#define SINGLETON_OBJECT(ObjName) SINGLETON_INSTANCE(C##ObjName)
#define DEFINE_SINGLETON(ClassName) \
ClassName* ClassName::m_pThis = nullptr;
#define DEFINE_P_THIS(ClassName) \
DEFINE_SINGLETON(ClassName)
#define DECLARE_SINGLETON_INTERFACE(ClassName) \
public: \
static ClassName* GetThis() {return m_pThis;} \
static ClassName& GetInstance() {return *m_pThis;} \
protected: \
static ClassName* m_pThis;
#define DECLARE_SINGLETON_CREATE_INSTANCE(ClassName) \
public: \
static BOOL CreateInstance() \
{ \
if(!m_pThis) \
m_pThis = new ClassName; \
\
return m_pThis != nullptr; \
} \
\
static BOOL DeleteInstance() \
{ \
if(m_pThis) \
{ \
delete m_pThis; \
m_pThis = nullptr; \
} \
\
return m_pThis == nullptr; \
}
#define DECLARE_PRIVATE_DEFAULT_CONSTRUCTOR(ClassName) \
private: \
ClassName(){}
#define DECLARE_PRIVATE_COPY_CONSTRUCTOR(ClassName) \
private: \
ClassName(const ClassName&); \
ClassName& operator = (const ClassName&);
#define DECLARE_NO_COPY_CLASS(className) \
DECLARE_PRIVATE_COPY_CONSTRUCTOR(className)
#define DECLARE_SINGLETON_IMPLEMENT_NO_CREATE_INSTANCE(ClassName) \
DECLARE_SINGLETON_INTERFACE(ClassName) \
DECLARE_PRIVATE_DEFAULT_CONSTRUCTOR(ClassName) \
DECLARE_PRIVATE_COPY_CONSTRUCTOR(ClassName)
#define DECLARE_SINGLETON_IMPLEMENT_NO_DEFAULT_CONSTRUCTOR(ClassName) \
DECLARE_SINGLETON_CREATE_INSTANCE(ClassName) \
DECLARE_PRIVATE_COPY_CONSTRUCTOR(ClassName)
#define DECLARE_SINGLETON_IMPLEMENT(ClassName) \
DECLARE_SINGLETON_IMPLEMENT_NO_DEFAULT_CONSTRUCTOR(ClassName) \
DECLARE_PRIVATE_DEFAULT_CONSTRUCTOR(ClassName)
#define DECLARE_SINGLETON_NO_DEFAULT_CONSTRUCTOR(ClassName) \
DECLARE_SINGLETON_INTERFACE(ClassName) \
DECLARE_SINGLETON_IMPLEMENT_NO_DEFAULT_CONSTRUCTOR(ClassName)
#define DECLARE_SINGLETON(ClassName) \
DECLARE_SINGLETON_NO_DEFAULT_CONSTRUCTOR(ClassName) \
DECLARE_PRIVATE_DEFAULT_CONSTRUCTOR(ClassName)
#define DECLARE_SINGLE_OBJECT(ClassName) CSingleObject<ClassName> _##ClassName##_Single_Object_;
SRWLOCK
SRWLOCK对象析构时系统会自动清理读写锁
Initialize a slim reader/writer (SRW) lock.
void InitializeSRWLock(
PSRWLOCK SRWLock
);
Acquires a slim reader/writer (SRW) lock in exclusive mode.
获取排他模式下的瘦读/写锁(SRW)。
void AcquireSRWLockExclusive(
PSRWLOCK SRWLock
);
Acquires a slim reader/writer (SRW) lock in shared mode.
获取共享模式下的瘦读/写锁(SRW)。
void AcquireSRWLockShared(
PSRWLOCK SRWLock
);
Releases a slim reader/writer (SRW) lock that was acquired in shared mode.
void ReleaseSRWLockShared(
PSRWLOCK SRWLock
);
Releases a slim reader/writer (SRW) lock that was acquired in exclusive mode.
void ReleaseSRWLockExclusive(
PSRWLOCK SRWLock
);
Attempts to acquire a slim reader/writer (SRW) lock in shared mode. If the call is successful, the calling thread takes ownership of the lock.
BOOLEAN TryAcquireSRWLockShared(
PSRWLOCK SRWLock
);
Attempts to acquire a slim reader/writer (SRW) lock in exclusive mode. If the call is successful, the calling thread takes ownership of the lock.
BOOLEAN TryAcquireSRWLockExclusive(
PSRWLOCK SRWLock
);