home *** CD-ROM | disk | FTP | other *** search
/ ActiveX Programming Unleashed CD / AXU.iso / source / chap04 / lst41 / lst41c.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-30  |  3.7 KB  |  230 lines

  1.  
  2. #include <objbase.h>    
  3. #include "resource.h"
  4. #include "lst41c.h"       
  5.           
  6. BSTR CreateBSTR(char *lpString)
  7. {
  8.  
  9.     BSTR bsz;
  10.     UINT cch;
  11.  
  12.     cch = strlen(lpString);
  13.  
  14.  
  15.     bsz = SysAllocStringLen(NULL , cch);
  16.     if(bsz == NULL)
  17.         return NULL;
  18.  
  19.     if(cch > 0)
  20.         MultiByteToWideChar(CP_ACP, 0, lpString, cch, bsz, cch);
  21.  
  22.     bsz[cch] = NULL;
  23.     return bsz;
  24. }
  25.  
  26. STDMETHODIMP_(BSTR)
  27. CLst41I::GetMachineName()
  28. {
  29.     BSTR b;
  30.  
  31.     ULONG ulLen;
  32.     
  33.     char *lpName;
  34.     lpName = new char[MAX_PATH];
  35.     ulLen = MAX_PATH;
  36.     
  37.     GetComputerName(lpName, &ulLen);
  38.     b = CreateBSTR(lpName);
  39.  
  40.     return b;
  41. }
  42.  
  43.  
  44. STDMETHODIMP CLst41I::QueryInterface(REFIID riid, void** ppv)
  45. {
  46.     return m_pLst41->QueryInterface(riid, ppv);
  47. }
  48.  
  49. STDMETHODIMP_(ULONG) CLst41I::AddRef()
  50. {
  51.     return m_pLst41->AddRef();
  52. }
  53.  
  54. STDMETHODIMP_(ULONG) CLst41I::Release()
  55. {
  56.     return m_pLst41->Release();
  57. }
  58.  
  59.  
  60. IUnknown *CreateDispatchInterface(IUnknown*    punkController,  void * pProgInterface)
  61. {
  62.     HRESULT hresult;
  63.     ITypeLib* ptlib;
  64.     ITypeInfo* ptinfo;
  65.     IUnknown* punkStdDisp;
  66.     
  67.     hresult = LoadRegTypeLib(LIBID_Lst41, 1, 0, 0x0409, &ptlib);
  68.     if (hresult != S_OK) 
  69.     {
  70.         if((hresult = LoadTypeLib(L"lst41.tlb", &ptlib)) != S_OK)
  71.         return NULL;
  72.     }
  73.  
  74.     hresult = ptlib->GetTypeInfoOfGuid(IID_ILst41, &ptinfo);
  75.     if (hresult != S_OK)
  76.         return NULL;
  77.     ptlib->Release();
  78.     
  79.  
  80.     hresult = CreateStdDispatch(punkController,    pProgInterface,    ptinfo,    &punkStdDisp);
  81.     if (hresult != S_OK)
  82.         return NULL;
  83.  
  84.     ptinfo->Release();
  85.     
  86.     return punkStdDisp;
  87. }
  88.  
  89.  
  90.  
  91. CLst41::CLst41()
  92. {
  93.     m_refs = 1;
  94.     m_disp_interface = NULL;
  95.     m_prog_interface = new CLst41I;
  96.     m_prog_interface->m_pLst41 = this;
  97. }
  98.  
  99.  
  100.  
  101. CLst41::~CLst41()
  102. {
  103.     delete m_prog_interface;
  104. }
  105.  
  106.  
  107.  
  108. CLst41* CLst41::Create()
  109. {
  110.     CLst41* pLst41;
  111.     IUnknown* punkStdDisp; 
  112.    
  113.     pLst41 = new CLst41();
  114.     if(pLst41 == NULL)
  115.       return NULL;
  116.  
  117.     punkStdDisp = CreateDispatchInterface((IUnknown*) pLst41,
  118.                       pLst41->m_prog_interface);
  119.     if (punkStdDisp == NULL) {
  120.       pLst41->Release();
  121.       return NULL;
  122.     }
  123.  
  124.     pLst41->m_disp_interface = punkStdDisp;
  125.     return pLst41; 
  126. }
  127.  
  128.  
  129.  
  130. STDMETHODIMP CLst41::QueryInterface(REFIID riid, void ** ppv)
  131. {
  132.     if (riid == IID_IUnknown)
  133.         *ppv = this;
  134.     else if (riid == IID_IDispatch || riid == DIID_DLst41)
  135.         return m_disp_interface->QueryInterface(IID_IDispatch, ppv);
  136.     else if (riid == IID_ILst41)
  137.         *ppv = &m_prog_interface;
  138.     else 
  139.     {
  140.           *ppv = NULL;
  141.         return ResultFromScode(E_NOINTERFACE);
  142.     }
  143.  
  144.     AddRef();
  145.     return S_OK;
  146. }
  147.  
  148.  
  149. STDMETHODIMP_(ULONG) CLst41::AddRef()
  150. {
  151.     return ++m_refs;
  152. }
  153.  
  154. STDMETHODIMP_(ULONG) CLst41::Release()
  155. {
  156.     if(--m_refs == 0)
  157.     {
  158.         if(m_disp_interface != NULL)
  159.             m_disp_interface->Release();
  160.         PostQuitMessage(0);
  161.         delete this;
  162.         return 0;
  163.     }
  164.  
  165.     return m_refs;
  166. }
  167.  
  168.  
  169.  
  170. CLst41CF::CLst41CF()
  171.     m_refs = 1; 
  172. }
  173.  
  174.  
  175.  
  176. IClassFactory* CLst41CF::Create()
  177. {
  178.     return new  CLst41CF();
  179. }
  180.  
  181. STDMETHODIMP CLst41CF::QueryInterface(REFIID riid, void** ppv)
  182. {
  183.     if(riid == IID_IUnknown || riid == IID_IClassFactory)
  184.     {
  185.         AddRef();
  186.         *ppv = this;
  187.         return S_OK;
  188.     }
  189.     
  190.     *ppv = NULL;
  191.     return ResultFromScode(E_NOINTERFACE);
  192. }
  193.  
  194.  
  195. STDMETHODIMP_(ULONG) CLst41CF::AddRef()
  196. {
  197.     return ++m_refs;
  198. }
  199.  
  200.  
  201.  
  202.  
  203.  
  204. STDMETHODIMP_(ULONG) CLst41CF::Release()
  205. {
  206.     if(--m_refs == 0) 
  207.     {
  208.        delete this;
  209.        return 0;
  210.     }
  211.  
  212.     return m_refs;
  213. }
  214.  
  215.  
  216. STDMETHODIMP CLst41CF::CreateInstance(IUnknown* punkOuter,REFIID riid,void** ppv)
  217. {
  218.     extern CLst41 * g_pLst41;
  219.     
  220.     return g_pLst41->QueryInterface(riid, ppv);
  221. }
  222.  
  223.  
  224.  
  225. STDMETHODIMP CLst41CF::LockServer(BOOL fLock)
  226. {
  227.     return S_OK;
  228. }
  229.