⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 factory2.cpp

📁 VC++串口通信设。本书详细说明讲解了在VC++环境下编写串口通信得过程。值得一看
💻 CPP
字号:
// Get needed compiler include files
#include <iostream>

// Get needed system and custom include files
#define INITGUID
#include "Utility.h"
#include "Factory2.h"
#include "Fortune2.h"
#include "Counts.h"


// Constructor
ComFortuneTellerFactory::ComFortuneTellerFactory()
        : m_cRef(0)
{
   // Be annoying and verbose
   VerboseMsg("Constructing new ComFortuneTellerFactory object.\n");
}


//
// IUnknown methods
//

STDMETHODIMP ComFortuneTellerFactory::QueryInterface(REFIID rIID,
                                                     PPVOID ppvInterface)
{
   VerboseMsg("In ComFortuneTellerFactory::QueryInterface\n");

   // Initialize returned interface pointer
   *ppvInterface = NULL;

   // Set the interface pointer
   if (rIID == IID_IUnknown) {
      VerboseMsg("   Requesting IUnknown interface.\n");
      *ppvInterface = this;
   }

   else if (rIID == IID_IClassFactory) {
      VerboseMsg("   Requesting IClassFactory interface.\n");
      *ppvInterface = this;
   }

   // We don't support this interface
   else {
      VerboseMsg("   Requesting unsupported interface.\n");
      *ppvInterface = NULL;
      return E_NOINTERFACE;
   }

   // Bump up the reference count
   ((LPUNKNOWN) *ppvInterface)->AddRef();

   return NOERROR;
}

STDMETHODIMP_(ULONG) ComFortuneTellerFactory::AddRef()
{
   // Increment the reference count
   m_cRef++;

   // Convert to string and display
   VerboseMsg("In ComFortuneTellerFactory::AddRef. Reference count = "
              + ULongToStr(m_cRef) + "\n");

   return m_cRef;
}

STDMETHODIMP_(ULONG) ComFortuneTellerFactory::Release()
{
   // Decrement the reference count
   m_cRef--;

   // Convert to string and display
   VerboseMsg("In ComFortuneTellerFactory::Release. Reference count = "
              + ULongToStr(m_cRef) + "\n");

   // Is this the last reference to the object?
   if (m_cRef)
      return m_cRef;

   // Self destruct
   VerboseMsg("   ComFortuneTellerFactory reference count is 0. Deleting self.\n");
   delete this;
   return 0;
}


//
// IFortuneTeller methods
//

STDMETHODIMP ComFortuneTellerFactory::CreateInstance(LPUNKNOWN pUnkOuter,
                                                     REFIID rIID,
                                                     PPVOID ppvInterface)
{
   PComFortuneTeller  pObj;
   HRESULT            hResult;

   VerboseMsg("In ComFortuneTellerFactory::CreateInstance\n");

   // Initialize returned interface pointer
   *ppvInterface = NULL;
   
   // Check for a controlling unknown
   if (pUnkOuter && rIID != IID_IUnknown)
      return CLASS_E_NOAGGREGATION;

   //Create the object passing function to notify on destruction.
   VerboseMsg("   Creating new ComFortuneTeller object\n");
   pObj = new ComFortuneTeller;

   // Out of memory?
   if (!pObj) {
      VerboseMsg("   FortuneTeller object creation failed.\n");
      return E_OUTOFMEMORY;
   }

   // Now obtain the requested interface
   hResult = pObj->QueryInterface(rIID, ppvInterface);

   // Destroy the object if the desired interface couldn't be obtained
   if (FAILED(hResult)) {
      delete pObj;
      return hResult;
   }

   // Everything looks good. Bump up the server object count
   Counters::IncObjectCount();

   return NOERROR;
}

STDMETHODIMP ComFortuneTellerFactory::LockServer(BOOL fLock)
{
   VerboseMsg("In ComFortuneTellerFactory::LockServer\n");

   // Are we locking or unlocking?
   if (fLock) {

      // Locking
      VerboseMsg("   Incrementing server lock count\n");
      Counters::IncLockCount();
   }
   else {

      // Unlocking
      VerboseMsg("   Decrementing server lock count\n");
      Counters::DecLockCount();
   }

   return NOERROR;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -