📄 tmisc.cpp
字号:
static char *tmisc_id =
"@(#)Copyright (C) H.Shirouzu 1996-2008 tmisc.cpp Ver1.71";
/* ========================================================================
Project Name : Win32 Lightweight Class Library Test
Module Name : Application Frame Class
Create : 1996-06-01(Sat)
Update : 2008-02-02(Sat)
Copyright : H.Shirouzu
Reference :
======================================================================== */
#include "tlib.h"
#include <stdio.h>
#include <mbstring.h>
#include <stdlib.h>
DWORD TWinVersion = ::GetVersion();
BOOL (WINAPI *pCryptAcquireContext)(HCRYPTPROV *, LPCSTR, LPCSTR, DWORD, DWORD);
BOOL (WINAPI *pCryptDestroyKey)(HCRYPTKEY);
BOOL (WINAPI *pCryptGenRandom)(HCRYPTPROV, DWORD, BYTE *);
BOOL (WINAPI *pCryptCreateHash)(HCRYPTPROV, ALG_ID, HCRYPTKEY, DWORD, HCRYPTHASH *);
BOOL (WINAPI *pCryptDestroyHash)(HCRYPTHASH);
BOOL (WINAPI *pCryptHashData)(HCRYPTHASH, BYTE *, DWORD, DWORD);
BOOL (WINAPI *pCryptGetHashParam)(HCRYPTHASH, DWORD, BYTE *, DWORD *, DWORD);
BOOL (WINAPI *pCryptReleaseContext)(HCRYPTPROV, DWORD);
BOOL InitWin32API()
{
HMODULE advdll = ::GetModuleHandle("advapi32.dll");
pCryptAcquireContext = (BOOL (WINAPI *)(HCRYPTPROV *, LPCSTR, LPCSTR, DWORD, DWORD))::GetProcAddress(advdll, "CryptAcquireContextA");
pCryptGenRandom = (BOOL (WINAPI *)(HCRYPTPROV, DWORD, BYTE *))::GetProcAddress(advdll, "CryptGenRandom");
pCryptCreateHash = (BOOL (WINAPI *)(HCRYPTPROV, ALG_ID, HCRYPTKEY, DWORD, HCRYPTHASH *))::GetProcAddress(advdll, "CryptCreateHash");
pCryptDestroyHash = (BOOL (WINAPI *)(HCRYPTHASH))::GetProcAddress(advdll, "CryptDestroyHash");
pCryptHashData = (BOOL (WINAPI *)(HCRYPTHASH, BYTE *, DWORD, DWORD))::GetProcAddress(advdll, "CryptHashData");
pCryptGetHashParam = (BOOL (WINAPI *)(HCRYPTHASH, DWORD, BYTE *, DWORD *, DWORD))::GetProcAddress(advdll, "CryptGetHashParam");
pCryptReleaseContext = (BOOL (WINAPI *)(HCRYPTPROV, DWORD))::GetProcAddress(advdll, "CryptReleaseContext");
return TRUE;
}
TDigest::TDigest(TDigest::Type _type)
{
type = _type;
hProv = NULL;
hHash = NULL;
}
TDigest::~TDigest()
{
if (hHash) pCryptDestroyHash(hHash);
if (hProv) pCryptReleaseContext(hProv, 0);
}
BOOL TDigest::Init()
{
if (hProv == NULL) {
if (!pCryptAcquireContext(&hProv, NULL, MS_DEF_DSS_PROV, PROV_DSS, 0)) {
pCryptAcquireContext(&hProv, NULL, MS_DEF_DSS_PROV, PROV_DSS, CRYPT_NEWKEYSET);
}
}
return pCryptCreateHash(hProv, type == SHA1 ? CALG_SHA : CALG_MD5, 0, 0, &hHash);
}
BOOL TDigest::Reset()
{
if (hHash) {
pCryptDestroyHash(hHash);
hHash = NULL;
}
return Init();
}
BOOL TDigest::Update(void *data, int size)
{
if (hProv == NULL) Init();
return pCryptHashData(hHash, (BYTE *)data, size, 0);
}
BOOL TDigest::GetVal(void *data)
{
DWORD size = type == SHA1 ? SHA1_SIZE : MD5_SIZE;
return pCryptGetHashParam(hHash, HP_HASHVAL, (BYTE *)data, &size, 0);
}
BOOL TGenRandom(void *buf, int len)
{
static HCRYPTPROV hProv;
if (hProv == NULL) {
if (!pCryptAcquireContext(&hProv, NULL, MS_DEF_DSS_PROV, PROV_DSS, 0)) {
pCryptAcquireContext(&hProv, NULL, MS_DEF_DSS_PROV, PROV_DSS, CRYPT_NEWKEYSET);
}
}
if (hProv && pCryptGenRandom && pCryptGenRandom(hProv, (DWORD)len, (BYTE *)buf))
return TRUE;
for (int i=0; i < len; i++) {
*((BYTE *)buf + i) = (BYTE)(rand() >> 8);
}
return TRUE;
}
TResHash::TResHash(int _hashNum)
{
hashNum = _hashNum;
hashTbl = new TResHashObj *[hashNum];
memset(hashTbl, 0, sizeof(TResHashObj *) * hashNum);
}
BOOL TResHash::Register(TResHashObj *target)
{
TResHashObj **obj;
for (obj = &hashTbl[target->resId % hashNum]; *obj; obj=&(*obj)->next)
;
*obj = target;
return TRUE;
}
TResHashObj *TResHash::Search(UINT resId)
{
for (TResHashObj *obj = hashTbl[resId % hashNum]; obj; obj=obj->next) {
if (obj->resId == resId)
return obj;
}
return NULL;
}
static HINSTANCE defaultInstance;
void InitInstanceForLoadStr(HINSTANCE hI)
{
defaultInstance = hI;
}
LPSTR GetLoadStrA(UINT resId, HINSTANCE hI)
{
static TResHash *hash;
if (hash == NULL) {
hash = new TResHash(100);
}
char buf[1024];
TResHashObj *obj;
if ((obj = hash->Search(resId)) == NULL) {
if (::LoadStringA(hI ? hI : defaultInstance, resId, buf, sizeof(buf)) >= 0) {
obj = new TResHashObj(resId, strdup(buf));
hash->Register(obj);
}
}
return obj ? (char *)obj->val : NULL;
}
LPWSTR GetLoadStrW(UINT resId, HINSTANCE hI)
{
static TResHash *hash;
if (hash == NULL) {
hash = new TResHash(100);
}
WCHAR buf[1024];
TResHashObj *obj;
if ((obj = hash->Search(resId)) == NULL) {
if (::LoadStringW(hI ? hI : defaultInstance, resId, buf, sizeof(buf) / sizeof(WCHAR)) >= 0) {
obj = new TResHashObj(resId, wcsdup(buf));
hash->Register(obj);
}
}
return obj ? (LPWSTR)obj->val : NULL;
}
static LCID defaultLCID;
void TSetDefaultLCID(LCID lcid)
{
defaultLCID = lcid ? lcid : ::GetSystemDefaultLCID();
::SetThreadLocale(defaultLCID);
}
HMODULE TLoadLibrary(LPTSTR dllname)
{
HMODULE hModule = ::LoadLibrary(dllname);
if (defaultLCID)
::SetThreadLocale(defaultLCID);
return hModule;
}
/*=========================================================================
僷僗崌惉乮ANSI 斉乯
=========================================================================*/
int MakePath(char *dest, const char *dir, const char *file)
{
BOOL separetor = TRUE;
size_t len;
if ((len = strlen(dir)) == 0)
return wsprintf(dest, "%s", file);
if (dir[len -1] == '\\') // 昞側偳丄2byte栚偑'\\'偱廔傞暥帤楍懳嶔
{
if (len >= 2 && IsDBCSLeadByte(dir[len -2]) == FALSE)
separetor = FALSE;
else {
u_char *p=(u_char *)dir;
for (; *p && p[1]; IsDBCSLeadByte(*p) ? p+=2 : p++)
;
if (*p == '\\')
separetor = FALSE;
}
}
return wsprintf(dest, "%s%s%s", dir, separetor ? "\\" : "", file);
}
/*=========================================================================
僷僗崌惉乮UNICODE 斉乯
=========================================================================*/
int MakePathW(WCHAR *dest, const WCHAR *dir, const WCHAR *file)
{
size_t len;
if ((len = wcslen(dir)) == 0)
return wsprintfW(dest, L"%s", file);
return wsprintfW(dest, L"%s%s%s", dir, dir[len -1] == L'\\' ? L"" : L"\\" , file);
}
WCHAR lGetCharIncW(const WCHAR **str)
{
return *(*str)++;
}
WCHAR lGetCharIncA(const char **str)
{
WCHAR ch = *(*str)++;
if (IsDBCSLeadByte((BYTE)ch)) {
ch <<= BITS_OF_BYTE;
ch |= *(*str)++; // null 敾掕偼庤敳偒
}
return ch;
}
WCHAR lGetCharW(const WCHAR *str, int offset)
{
return str[offset];
}
WCHAR lGetCharA(const char *str, int offset)
{
while (offset-- > 0)
lGetCharIncA(&str);
return lGetCharIncA(&str);
}
void lSetCharW(WCHAR *str, int offset, WCHAR ch)
{
str[offset] = ch;
}
void lSetCharA(char *str, int offset, WCHAR ch)
{
while (offset-- > 0) {
if (IsDBCSLeadByte(*str++))
*str++;
}
BYTE high_ch = ch >> BITS_OF_BYTE;
if (high_ch)
*str++ = high_ch;
*str = (BYTE)ch;
}
/*=========================================================================
Debug
=========================================================================*/
void Debug(char *fmt,...)
{
char buf[8192];
va_list ap;
va_start(ap, fmt);
_vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
::OutputDebugString(buf);
}
#ifndef _WIN64
/*=========================================================================
椺奜忣曬庢摼
=========================================================================*/
static char *ExceptionTitle;
static char *ExceptionLogFile;
static char *ExceptionLogInfo;
#define STACKDUMP_SIZE 256
#define MAX_STACKDUMP_SIZE 8192
LONG WINAPI Local_UnhandledExceptionFilter(struct _EXCEPTION_POINTERS *info)
{
static char buf[(STACKDUMP_SIZE/sizeof(DWORD)) * 10 + 100]; // 10 ... %08x + \r\n
static HANDLE hFile;
static SYSTEMTIME tm;
static CONTEXT *context;
static DWORD len, i, j;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -