示例#1
0
HRESULT CNktDvProcessMemory::WriteStringW(__in LPVOID lpRemoteDest, __in_nz_opt LPCWSTR szSrcW,
                                          __in SIZE_T nSrcLen, __in BOOL bWriteNulTerminator)
{
  CNktAutoFastMutex cLock(&GetLockObject());
  HRESULT hRes;
  WCHAR chW;

  if (lpRemoteDest == NULL || szSrcW == NULL)
    return E_POINTER;
  if (nSrcLen == NKT_SIZE_T_MAX)
    nSrcLen = wcslen(szSrcW);
  if (nSrcLen > 0)
  {
    hRes = WriteProtected((LPWSTR)lpRemoteDest, szSrcW, nSrcLen*sizeof(WCHAR));
    if (FAILED(hRes))
      return hRes;
  }
  if (bWriteNulTerminator != FALSE)
  {
    chW = 0;
    hRes = WriteProtected((LPWSTR)lpRemoteDest+nSrcLen,  &chW, sizeof(WCHAR));
    if (FAILED(hRes))
      return hRes;
  }
  return S_OK;
}
示例#2
0
VOID CNktDvTransportEngine::InternalDisconnectAgent2(__inout CNktDvTransportEngine::CConnection *lpConn,
                                                     __in BOOL bCallCallback)
{
  BOOL bDoRelease;
  SIZE_T i, nCount;

  //remove packets from dispatchers if any
  nCount = cFixedDispatchersList.GetCount();
  for (i=0; i<nCount; i++)
    cFixedDispatchersList[i]->RemoveConnection(lpConn);
  {
    CNktAutoFastMutex cLock(&(sOneShotDispatchers.cMtx));
    TNktLnkLst<CDispatcher>::Iterator it;
    CDispatcher *lpDisp;

    for (lpDisp=it.Begin(sOneShotDispatchers.cList); lpDisp!=NULL; lpDisp=it.Next())
      lpDisp->RemoveConnection(lpConn);
  }
  //release?
  bDoRelease = (lpConn->nState != XSTATE_Destroying) ? TRUE : FALSE;
  //shutdown
  lpConn->Shutdown();
  //call callback
  if (bCallCallback != FALSE && bDoRelease != FALSE)
  {
    CNktAutoFastMutexReverse cLockRev(this);

    lpCallback->TEC_OnConnectionClosed(this, lpConn->dwPid);
  }
  //extra release for destroying
  if (bDoRelease != FALSE)
    lpConn->Release();
  return;
}
// Reset
HRESULT COpcDaEnumItemWrapper::Reset()
{
	COpcLock cLock(*this);

	// check inner server.
	if (m_ipUnknown == NULL)
	{
		return E_FAIL;
	}

	// fetch required interface.
	IEnumOPCItemAttributes* ipInterface = NULL;

	if (FAILED(m_ipUnknown->QueryInterface(IID_IEnumOPCItemAttributes, (void**)&ipInterface)))
	{
		return E_NOTIMPL;
	}

	// invoke method.
	HRESULT hResult = ipInterface->Reset();

	// release interface.
	ipInterface->Release();

	return hResult;
}
示例#4
0
VOID CNktDvTransportEngine::CConnection::Shutdown()
{
  BOOL bDiscardBuffers;

  bDiscardBuffers = FALSE;
  {
    CNktAutoFastMutex cLock(this);

    if (nState != XSTATE_Destroying)
    {
      //destroy pipe
      if (hPipe != NULL)
      {
        ::DisconnectNamedPipe(hPipe);
        ::CloseHandle(hPipe);
        hPipe = NULL;
      }
      //set new state
      nState = XSTATE_Destroying;
      bDiscardBuffers = TRUE;
    }
  }
  if (bDiscardBuffers != FALSE)
    DiscardAllBuffers();
  return;
}
示例#5
0
HRESULT CNktDvStackTrace::GetNearestFunction(__deref_out CNktDvExportedFunction **lplpFunc,
                                             __in SIZE_T nDepth)
{
  HRESULT hRes;

  if (lplpFunc == NULL)
    return E_POINTER;
  *lplpFunc = NULL;
  if (nDepth >= NKT_DV_TMSG_ONHOOKCALLED_StackTraceDepth)
    return E_INVALIDARG;
  if (nStackTrace[nDepth] == 0)
    return NKT_DVERR_NotFound;
  {
    CNktAutoFastMutex cLock(&GetLockObject());

    hRes = InitExpFunc(nDepth);
    if (FAILED(hRes))
      return hRes;
    if (cExpFunc[nDepth] == NULL)
      return NKT_DVERR_NotFound;
    *lplpFunc = cExpFunc[nDepth];
    (*lplpFunc)->AddRef();
  }
  return S_OK;
}
示例#6
0
// SetSize
void COpcThreadPool::SetSize(UINT uMinThreads, UINT uMaxThreads)
{
	COpcLock cLock(*this);

	m_uMinThreads = uMinThreads;
	m_uMaxThreads = uMaxThreads;
}
示例#7
0
HRESULT CNktDvTransportEngine::CConnection::SendReadPacket()
{
  CNktDvTransportOverlapped *lpOvr;
  DWORD dwReaded;
  HRESULT hRes;

  //prepare buffer
  lpOvr = GetBuffer();
  if (lpOvr == NULL)
    return E_OUTOFMEMORY;
  //do read
  {
    CNktAutoFastMutex cLock(this);

    lpOvr->dwType = XTYPE_Read;
    lpOvr->nOrder = NktInterlockedIncrement(&nNextReadOrder);
    AddBufferToRwList(lpOvr);
    hRes = (::ReadFile(hPipe, &(lpOvr->sMsg), sizeof(lpOvr->sMsg), &dwReaded, &(lpOvr->sOvr)) != FALSE)
                  ? S_OK : NKT_HRESULT_FROM_LASTERROR();
  }
  if (FAILED(hRes) && hRes != NKT_HRESULT_FROM_WIN32(ERROR_IO_PENDING))
  {
    FreeBuffer(lpOvr);
    return hRes;
  }
  AddRef();
  NKT_DEBUGPRINTLNA(Nektra::dlTransport, ("%lu) TransportEngine[SendReadPacket]: Ovr=%IXh%s",
                     ::GetTickCount(), lpOvr, (hRes != S_OK) ? " (pending)" : ""));
  return S_OK;
}
示例#8
0
HRESULT CNktDvTransportEngine::ConnectAgent(__in DWORD dwPid, __in DWORD dwTimeout)
{
  CNktDvShutdownAutoLock cSdLock(&cShutdownMtx);
  CNktDvAutoCancellableFastMutex cLock(this, &cShutdownMtx);
  CConnection *lpConn;
  HRESULT hRes;

  if (cLock.IsLockHeld() == FALSE || cShutdownMtx.IsShuttingDown() != FALSE)
    return NKT_DVERR_Cancelled;
  if (cShutdownMtx.IsSystemActive() == FALSE)
    return E_FAIL; //not initialized
  if (dwPid == 0 || dwPid == dwMePid)
    return E_INVALIDARG;
  //check if connection already exists
  {
    CConnectionAutoRef cConnAutoRef(lpConn = FindConnectionAndAddRef(dwPid), FALSE);

    if (lpConn != NULL)
      return NKT_DVERR_AlreadyExists;
  }
  //----
  lpConn = NKT_MEMMGR_NEW CConnection(this, dwPid);
  if (lpConn == NULL)
    return E_OUTOFMEMORY;
  //create pipe
  hRes = lpConn->Initialize(hIOCP, dwTimeout);
  if (FAILED(hRes))
  {
    lpConn->Release();
    return hRes;
  }
  //add to connection list
  cConnList.PushTail(lpConn);
  return S_OK;
}
示例#9
0
HRESULT EMReadFrameInputPin::SetMediaType(const CMediaType *pmt) 
{	
	CAutoLock cLock(m_pReceiveLock);

	m_pDump->SetMediaType(pmt);
	return CRenderedInputPin::SetMediaType(pmt);
}
示例#10
0
HRESULT CNktHookInfoImpl::SendCustomMessage(__in my_ssize_t msgCode, __in my_ssize_t msgParam, __in VARIANT_BOOL sync,
        __out my_ssize_t *pRetVal)
{
    CNktSimpleLockNonReentrant cLock(&nLock);
    HRESULT hRes;

    if (nValid == 0)
    {
        hRes = E_FAIL;
    }
    else if (pRetVal == NULL)
    {
        hRes = E_POINTER;
    }
    else if (sCallTrampoline.fnSendCustomMessage == NULL)
    {
        *pRetVal = 0;
        hRes = E_FAIL;
    }
    else
    {
        NKT_ASSERT(sCallTrampoline.lpInternal != NULL);
        hRes = sCallTrampoline.fnSendCustomMessage(sCallTrampoline.lpInternal, (SIZE_T*)pRetVal, (SIZE_T)msgCode,
                (SIZE_T)msgParam, Bool_From_VariantBool(sync));
    }
    if (FAILED(hRes) && pRetVal != NULL)
        *pRetVal = 0;
    return ::SetupErrorInfoAndReturn(IID_INktHookInfo, hRes);
}
示例#11
0
HRESULT CNktDvTransportEngine::SendMsg(__in DWORD dwPid, __inout NKT_DV_TMSG_COMMON *lpMsg,
                                       __in SIZE_T nMsgSize)
{
  CNktDvShutdownAutoLock cSdLock(&cShutdownMtx);
  CConnectionAutoRef cConnAutoRef;
  CConnection *lpConn;
  CNktDvTransportOverlapped *lpOvr;
  HRESULT hRes;

  if (lpMsg == NULL)
    return E_POINTER;
  if (nMsgSize < sizeof(NKT_DV_TMSG_COMMON) || nMsgSize > NKT_DV_TRANSPORT_MAX_DATA_SIZE)
    return E_INVALIDARG;
  {
    CNktDvAutoCancellableFastMutex cLock(this, &cShutdownMtx);

    if (cLock.IsLockHeld() == FALSE || cShutdownMtx.IsShuttingDown() != FALSE)
      return NKT_DVERR_Cancelled;
    if (cShutdownMtx.IsSystemActive() == FALSE)
      return E_FAIL; //not initialized
    //find connection
    cConnAutoRef.Attach(lpConn = FindConnectionAndAddRef(dwPid), FALSE);
    if (lpConn == NULL)
      return NKT_DVERR_NotFound;
    NKT_DEBUGPRINTLNA(Nektra::dlTransport, ("%lu) TransportEngine[SendMsg]: Pid=%lu, Code=%lu, Id=%lu",
                       ::GetTickCount(), dwPid, lpMsg->dwMsgCode & (~NKT_DV_TMSG_CODE_CALLBACK),
                       lpMsg->dwMsgId & (~NKT_DV_TMSG_ID_CALLBACK)));
  }
  {
    CNktAutoFastMutex cConnAutoLock(lpConn);

    if (lpConn->nState != XSTATE_Connected)
      return E_FAIL; //not initialized
    //get a free buffer
    lpOvr = lpConn->GetBuffer();
    if (lpOvr == NULL)
      return E_OUTOFMEMORY;
    //fill buffer
    nktMemCopy(lpOvr->sMsg.aBuf, lpMsg, nMsgSize);
    //do write prepare
    lpOvr->dwType = XTYPE_WriteRequest;
    lpOvr->nOrder = NktInterlockedIncrement(&(lpConn->nNextWriteOrder));
    lpOvr->dwWrittenBytes = (DWORD)nMsgSize;
    lpConn->AddBufferToRwList(lpOvr);
    hRes = S_OK;
    if (::PostQueuedCompletionStatus(lpConn->hIocpCopy, 0, (ULONG_PTR)lpConn, &(lpOvr->sOvr)) == FALSE)
      hRes = NKT_HRESULT_FROM_LASTERROR();
  }
  if (FAILED(hRes))
  {
    lpConn->FreeBuffer(lpOvr);
    return hRes;
  }
  //done
  lpConn->AddRef();
  NKT_DEBUGPRINTLNA(Nektra::dlTransport, ("%lu) TransportEngine[SendMsg]: Pid=%lu, Ovr=%IXh",
                     ::GetTickCount(), dwPid, lpOvr));
  return S_OK;
}
示例#12
0
VOID CClsIdIidList::RemoveAll()
{
  CNktAutoFastMutex cLock(this);

  NKT_FREE(lpList);
  lpList = NULL;
  nCount = nSize = 0;
  return;
}
示例#13
0
bool multiMutex::trylock(unsigned long key, size_t& nLock)
{
  bool status(true);
  namedLock *pLock(NULL);

  if (pthread_mutex_lock(&controlMutex_))
    throw std::runtime_error("multiMutex::lock: pthread_mutex_lock error return");

  for (size_t n=0; n < N_locks_; ++n){
	  namedLock& cLock(vLock_[n]);

	  // Either find an already assigned named lock, or
	  //   return the first available named lock.
	  if (key == cLock.key_){
		  // there already is a matching lock:
		  pLock = &cLock;
		  nLock = n;
		  break;
	  }	 
	  else	 
	  if ((NULL == pLock) && (static_cast<unsigned long>(NULL) == cLock.key_)){
      // first available lock:
		  pLock = &cLock;
		  nLock = n;
	  }
  }

  if (NULL == pLock)
    throw std::runtime_error("multiMutex::lock: no new lock available");
  // This case should probably be a throw -- it will segfault next...
  // Either there are fewer locks than threads, or a thread took a lock
  //   for another key and didn't give it back.

  if (static_cast<unsigned long>(NULL) == pLock->key_)
	  pLock->key_ = key; // name the lock.

  // note: this also will work with recursive mutexes:		 
  ++pLock->refCount_;

  if (pthread_mutex_unlock(&controlMutex_))
    throw std::runtime_error("multiMutex::lock: pthread_mutex_unlock error return");

  // attempt to lock the mutex:
  int N_STAT(0);
  if ((N_STAT = pthread_mutex_trylock(&pLock->mutex_))){
    if (N_STAT == EBUSY)
      status = false; // mutex is locked
    else
      throw std::runtime_error("multiMutex::trylock: pthread_mutex_trylock error return");
  }
  else{
    pLock->tid_ = pthread_self();
    assert(pLock->tid_ != 0);
  }

  return status;
}
示例#14
0
// Run
void COpcThreadPool::Run()
{
	COpcLock cLock(*this);

	do
	{
		// increment waiting thread count.
		m_uWaitingThreads++;

		cLock.Unlock();

		// wait for message.
		DWORD dwResult = WaitForSingleObject(m_hEvent, INFINITE);

		cLock.Lock();		

		// decrement waiting thread count.
		m_uWaitingThreads--;

		// check for error or shutdown event.
		if (m_hEvent == NULL || dwResult != WAIT_OBJECT_0)
		{
			break;
		}

		// check if the queue has already been cleared.
		if (m_cQueue.GetCount() == 0)
		{
			ResetEvent(m_hEvent);

			if (m_uWaitingThreads >= m_uMinThreads)
			{
				break;
			}

			continue;
		}

		// get next message.
		COpcMessage* pMessage = m_cQueue.RemoveHead();

		// release queue lock - process message could hang.
		cLock.Unlock();

		// process message.
		pMessage->Process();
		delete pMessage;

		// re-acquire lock.
		cLock.Lock();
	}
	while (m_uWaitingThreads < m_uMinThreads);

	// decrement thread count.
	m_uTotalThreads--;
}
示例#15
0
文件: PuLog.cpp 项目: BornHunter/CGSF
void 
CPuLog::Uninit()
{
	CSmartLock cLock(static_cast<CCriticalClient*>(this));

	//
	if (NULL != m_pfpFile)
	{
		fclose(m_pfpFile);
		m_pfpFile = NULL;
	}
}
示例#16
0
void NetServer::OnUpdateAccept()
{
	mutex::scoped_lock cLock(m_cClientListMutex);
	size_t nSize = m_vecAcceptSocket.size();
	for(size_t i = 0; i < nSize; ++i)
	{
		(m_pOnEnter)(*m_vecAcceptSocket[i]);
		m_vecUsedSocket.push_back(m_vecAcceptSocket[i]);
	}
	m_vecAcceptSocket.clear();
	cLock.unlock();
}
示例#17
0
VOID CNktDvTransportEngine::DisconnectAgent(__in DWORD dwPid)
{
  CNktDvShutdownAutoLock cSdLock(&cShutdownMtx);
  CNktDvAutoCancellableFastMutex cLock(this, &cShutdownMtx);

  if (cLock.IsLockHeld() == FALSE || cShutdownMtx.IsShuttingDown() != FALSE)
    return;
  if (cShutdownMtx.IsSystemActive() == FALSE)
    return; //not initialized
  InternalDisconnectAgent(dwPid);
  return;
}
示例#18
0
HRESULT CClsIdIidList::Remove(__in REFCLSID sClsId, __in REFIID sIid)
{
  CNktAutoFastMutex cLock(this);
  SIZE_T nIndex;

  if ((nIndex = Find(sClsId, sIid)) != NKT_SIZE_T_MAX)
  {
    memmove(lpList+nIndex, lpList+(nIndex+1), (nCount-nIndex-1)*sizeof(ITEM));
    nCount--;
    return S_OK;
  }
  return S_FALSE;
}
示例#19
0
// Stop
void COpcThreadPool::Stop()
{
	COpcLock cLock(*this);

	// delete any remaining messages.
	while (m_cQueue.GetCount() > 0)
	{
		COpcMessage* pMessage = m_cQueue.RemoveHead();
		delete pMessage;
	}
	
	// close handle.
	CloseHandle(m_hEvent);
	m_hEvent = NULL;
}
示例#20
0
HANDLE CNktDvProcessMemory::GetReadAccessHandle()
{
  if (hProc[0] == NULL)
  {
    CNktAutoFastMutex cLock(&GetLockObject());
    TNktComPtr<CNktDvProcessHandlesMgr> cPhMgr;

    if (hProc[0] == NULL)
    {
      if (SUCCEEDED(CNktDvProcessHandlesMgr::Get(&cPhMgr)))
        hProc[0] = cPhMgr->GetHandle(dwPid, NKT_ACCESS_READ);
    }
  }
  return hProc[0];
}
示例#21
0
HRESULT CNktHookInfoImpl::get_Address(__deref_out my_ssize_t *pVal)
{
    CNktSimpleLockNonReentrant cLock(&nLock);

    if (pVal == NULL)
        return ::SetupErrorInfoAndReturn(IID_INktHookInfo, E_POINTER);
    if (nValid == 0)
    {
        *pVal = 0;
        return ::SetupErrorInfoAndReturn(IID_INktHookInfo, E_FAIL);
    }
    //get "address"
    *pVal = (my_ssize_t)nAddress;
    return ::SetupErrorInfoAndReturn(IID_INktHookInfo, S_OK);
}
示例#22
0
HRESULT CNktDvModulesEnumerator::MarkModuleAsDirty(__in HINSTANCE hDll)
{
  CNktAutoFastMutex cLock(&GetLockObject());
  SIZE_T i, nCount;

  nCount = sDirtyModules.aList.GetCount();
  for (i=0; i<nCount; i++)
  {
    if (sDirtyModules.aList[i] == hDll)
      return S_OK;
  }
  if (sDirtyModules.aList.AddElement(hDll) == FALSE)
    return E_OUTOFMEMORY;
  NktInterlockedExchange(&(sDirtyModules.nDoCheck), 1);
  return S_OK;
}
示例#23
0
VOID CNktDvTransportEngine::CDispatcher::RemoveConnection(__in CNktDvTransportEngine::CConnection *lpConn)
{
  CNktAutoFastMutex cLock(this);
  TNktLnkLst<CNktDvTransportOverlapped>::Iterator it;
  CNktDvTransportOverlapped *lpOvr;

  for (lpOvr=it.Begin(cQueueBufferList); lpOvr!=NULL; lpOvr=it.Next())
  {
    if (lpOvr->sEngineInternals.lpConn == lpConn)
    {
      lpConn->FreeBuffer(lpOvr);
      lpConn->Release();
    }
  }
  return;
}
示例#24
0
HANDLE CNktDvProcessMemory::GetWriteAccessHandle()
{
  if (hProc[1] == NULL)
  {
    CNktAutoFastMutex cLock(&GetLockObject());
    TNktComPtr<CNktDvProcessHandlesMgr> cPhMgr;

    if (hProc[1] == NULL && bWriteAccessChecked == FALSE)
    {
      bWriteAccessChecked = TRUE;
      if (SUCCEEDED(CNktDvProcessHandlesMgr::Get(&cPhMgr)))
        hProc[1] = cPhMgr->GetHandle(dwPid, NKT_ACCESS_WRITE);
    }
  }
  return hProc[1];
}
// Clone
HRESULT COpcDaEnumItemWrapper::Clone(IEnumOPCItemAttributes** ppEnum)
{
	COpcLock cLock(*this);

    // check for invalid arguments.
    if (ppEnum == NULL)
    {
        return E_INVALIDARG;
    }

	// check inner server.
	if (m_ipUnknown == NULL)
	{
		return E_FAIL;
	}

	// fetch required interface.
	IEnumOPCItemAttributes* ipInterface = NULL;

	if (FAILED(m_ipUnknown->QueryInterface(IID_IEnumOPCItemAttributes, (void**)&ipInterface)))
	{
		return E_NOTIMPL;
	}

	// invoke method.
	IEnumOPCItemAttributes* ipEnum = NULL;

	HRESULT hResult = ipInterface->Clone(&ipEnum);

	// release interface.
	ipInterface->Release();

	// create wrapper.
	COpcDaEnumItemWrapper* pEnum = new COpcDaEnumItemWrapper(ipEnum);

	// release local reference.
	ipEnum->Release();

	// query for interface.
    hResult = pEnum->QueryInterface(IID_IEnumOPCItemAttributes, (void**)ppEnum);

    // release local reference.
    pEnum->Release();

    return hResult;
}
示例#26
0
HRESULT CNktHookInfoImpl::CurrentProcess(__deref_out INktProcess **ppProc)
{
    CNktSimpleLockNonReentrant cLock(&nLock);
    TNktComPtr<INktProcess> cIProc;
    HRESULT hRes;

    if (ppProc == NULL)
        return ::SetupErrorInfoAndReturn(IID_INktHookInfo, E_POINTER);
    *ppProc = NULL;
    if (nValid == 0)
        return ::SetupErrorInfoAndReturn(IID_INktHookInfo, E_FAIL);
    //get outer interface
    hRes = GetComLinkHelper<CNktProcessImpl,INktProcess,CNktDvProcess>(&cIProc, cProc, InterfaceItemGetCookies());
    //done (don't create dummy interface on error)
    *ppProc = cIProc.Detach();
    return ::SetupErrorInfoAndReturn(IID_INktHookInfo, hRes);
}
示例#27
0
CNktDvDbObjectNoRef* CNktDvExportedFunction::GetFunctionEntry() const
{
  if (nDbObjInitialized == 0)
  {
    CNktDvExportedFunction *lpThis = const_cast<CNktDvExportedFunction*>(this);
    {
      CNktAutoFastMutex cLock(&(lpThis->GetLockObject()));

      if (nDbObjInitialized == 0)
      {
        //search the DbObject in the database the first time it is required
        lpThis->lpDbObj = (cDvDB != NULL) ? (cDvDB->FindFunctionByName(GetName())) : NULL;
        NktInterlockedExchange(&(lpThis->nDbObjInitialized), 1);
      }
    }
  }
  return lpDbObj;
}
示例#28
0
LPWSTR CNktDvStackTrace::GetNearestSymbol(__in SIZE_T nDepth) const
{
  CNktDvStackTrace *lpThis = const_cast<CNktDvStackTrace*>(this);
  LPWSTR sW;

  sW = NULL;
  if (nDepth < NKT_DV_TMSG_ONHOOKCALLED_StackTraceDepth &&
      nStackTrace[nDepth] != 0)
  {
    CNktAutoFastMutex cLock(&(lpThis->GetLockObject()));
    LPWSTR szCopyW;
    SIZE_T nLen;
    HRESULT hRes;

    if (szSymbolW[nDepth] == NULL)
    {
      hRes = lpThis->InitExpFunc(nDepth);
      if (FAILED(hRes))
        return NULL;
      if (cExpFunc[nDepth] != NULL)
      {
        sW = cExpFunc[nDepth]->GetCompleteName();
      }
      else if (cMod[nDepth] != NULL)
      {
        sW = cMod[nDepth]->GetFileName();
      }
      else
      {
        sW = L"";
      }
      nLen = wcslen(sW) + 1;
      szCopyW = (LPWSTR)nktMemMalloc(nLen * sizeof(WCHAR));
      if (szCopyW == NULL)
        return NULL;
      nktMemCopy(szCopyW, sW, nLen * sizeof(WCHAR));
      _ReadWriteBarrier();
      lpThis->szSymbolW[nDepth] = szCopyW;
      _ReadWriteBarrier();
    }
    sW = szSymbolW[nDepth];
  }
  return sW;
}
示例#29
0
文件: PuLog.cpp 项目: BornHunter/CGSF
BOOL 
CPuLog::Init()
{
	if (FALSE == CCriticalClient::IsActive())
	{
		return FALSE;
	}

	//
	CSmartLock cLock(static_cast<CCriticalClient*>(this));

	//
	if (NULL != m_pfpFile)
	{
		return TRUE;
	}

	//
	char achLogFile[MAX_PATH + 1];
	char achBackupLogFile[MAX_PATH + 1];

	GetPuCfgInstance().GetLogFileName(achLogFile);
	GetPuCfgInstance().GetBackupLogFileName(achBackupLogFile);

	//
	if ('\0' == achLogFile[0] || '\0' == achBackupLogFile[0])
	{
		return FALSE;
	}

	//
	remove(achBackupLogFile);
	rename(achLogFile, achBackupLogFile);

	//
	m_pfpFile = fopen(achLogFile, "a");
	if (NULL == m_pfpFile)
	{
		return FALSE;
	}

	return TRUE;
}
// Next
HRESULT COpcDaEnumItemWrapper::Next(
	ULONG               celt,
	OPCITEMATTRIBUTES** ppItemArray,
	ULONG*              pceltFetched
)
{
	COpcLock cLock(*this);

	// check inner server.
	if (m_ipUnknown == NULL)
	{
		return E_FAIL;
	}

	// fetch required interface.
	IEnumOPCItemAttributes* ipInterface = NULL;

	if (FAILED(m_ipUnknown->QueryInterface(IID_IEnumOPCItemAttributes, (void**)&ipInterface)))
	{
		return E_NOTIMPL;
	}

	// invoke method.
	HRESULT hResult = ipInterface->Next(
		celt,
		ppItemArray,
		pceltFetched
	);

	// release interface.
	ipInterface->Release();

	if (hResult == S_OK)
	{
		if (celt > 0 && (*ppItemArray == NULL || *pceltFetched == 0))
		{
			return S_FALSE;
		}
	}

	return hResult;
}