LAPTOP-SNT8I5JK\Boounion
2025-09-18 df4d0e875ccfe40add25100a75dedee54e566aaa
SourceCode/Bond/Servo/Context.cpp
@@ -1,12 +1,184 @@
#include "stdafx.h"
#include "Context.h"
#include <dbghelp.h>
#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;
}