#include "stdafx.h" #include "Context.h" #include #pragma comment(lib, "dbghelp.lib") void PrintStackTrace() { void* stack[62]; // ×î¶à×¥62²ã USHORT frames = CaptureStackBackTrace(0, 62, stack, NULL); HANDLE process = GetCurrentProcess(); SymInitialize(process, NULL, TRUE); for (USHORT i = 0; i < frames; ++i) { DWORD64 address = (DWORD64)(stack[i]); char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)]; PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer; symbol->SizeOfStruct = sizeof(SYMBOL_INFO); symbol->MaxNameLen = MAX_SYM_NAME; if (SymFromAddr(process, address, 0, symbol)) { TRACE(">>>> name:%s\n", symbol->Name); } else { TRACE(">>>> name:%s\n", "SymFromAddr failed"); } } SymCleanup(process); } CContext::CContext() { m_onReleaseCallback = nullptr; m_nRef = 0; m_nRetCode = 0; m_hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); InitializeCriticalSection(&m_criticalSection); } CContext::~CContext() { if (m_hEvent != NULL) { CloseHandle(m_hEvent); m_hEvent = NULL; } DeleteCriticalSection(&m_criticalSection); } void CContext::setOnRelease(ONRELEASECALLBACK fOnRelease) { m_onReleaseCallback = fOnRelease; } int CContext::addRef() { Lock(); m_nRef++; Unlock(); return m_nRef; } int CContext::release() { Lock(); if (m_nRef > 0) { m_nRef--; BOOL bRefCount0 = m_nRef == 0; Unlock(); if (bRefCount0 && m_onReleaseCallback != nullptr) { m_onReleaseCallback(this); } } else { Unlock(); } return m_nRef; } void CContext::setRetCode(int code) { m_nRetCode = code; } int CContext::getRetCode() { return m_nRetCode; } void CContext::setRetMsg(const char* pszMsg) { m_strRetMsg = pszMsg; } std::string& CContext::getRetMsg() { return m_strRetMsg; } HANDLE CContext::getEventHandle() { return m_hEvent; } void CContext::setEvent() { if (m_hEvent != NULL) { SetEvent(m_hEvent); } } void CContext::resetEvent() { if (m_hEvent != NULL) { ResetEvent(m_hEvent); } } void CContext::ReadString(CArchive& ar, std::string& string) { CString strTemp; ar >> strTemp; string = (LPTSTR)(LPCTSTR)strTemp; } void CContext::WriteString(CArchive& ar, std::string& string) { CString strTemp = string.c_str(); ar << strTemp; } void CContext::createDir(CString strDir) { int lastIndex = 0; int index = strDir.Find(_T("\\"), lastIndex); while (index > 0) { CString strTempDir = strDir.Left(index); CreateDirectory(strTempDir, NULL); lastIndex = index + 1; index = strDir.Find(_T("\\"), lastIndex); } CreateDirectory(strDir, NULL); } BOOL CContext::IsBoxId(CString& strId) { //'W20'¿ªÍ·£¬µ¹ÊýµÚÎåλΪ'Z'µÄ×Ö·û´® if (strId.GetLength() < 8) { return FALSE; } if (strId.Left(3).Compare(_T("W20")) != 0) { return FALSE; } if (strId.Right(5).GetAt(0) != (char)'Z') { return FALSE; } return TRUE; } BOOL CContext::IsLotId(CString& strId) { //'N20'¿ªÍ·£¬µ¹ÊýµÚÎåλΪ'Z'µÄ×Ö·û´® if (strId.GetLength() < 8) { return FALSE; } if (strId.Left(3).Compare(_T("N20")) != 0) { return FALSE; } if (strId.Right(5).GetAt(0) != (char)'Z') { return FALSE; } return TRUE; }