CPOINT.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*** 
  2. *cpoint.cpp
  3. *
  4. *  This is a part of the Microsoft Source Code Samples.
  5. *
  6. *  Copyright (C) 1992-1997 Microsoft Corporation. All rights reserved.
  7. *
  8. *  This source code is only intended as a supplement to Microsoft Development
  9. *  Tools and/or WinHelp documentation.  See these sources for detailed
  10. *  information regarding the Microsoft samples programs.
  11. *
  12. *Purpose:
  13. *  This module implements the CPoint and CPointCF classes.
  14. *
  15. *  This module is intended as a sample implementation of the IDispatch
  16. *  interface, and its purpose is to demonstrate how an object can
  17. *  expose methods and properties for programatic and cross-process
  18. *  access via the IDispatch interface.
  19. *
  20. *Implementation Notes:
  21. *
  22. *****************************************************************************/
  23. #include "spoly.h"
  24. #include "cpoint.h"
  25. CPoint::CPoint()
  26. {
  27.     m_x = 0;
  28.     m_y = 0;
  29.     m_refs = 0;
  30.     m_ptinfo = NULL;
  31. }
  32. /***
  33. *CPoint::Create(void)
  34. *Purpose:
  35. *  Create an instance of a CPoint object.
  36. *
  37. *Entry:
  38. *  None
  39. *
  40. *Exit:
  41. *  returns a CPoint*, NULL if creation failed.
  42. *
  43. ***********************************************************************/
  44. CPoint FAR*
  45. CPoint::Create()
  46. {
  47.     HRESULT hresult;
  48.     CPoint FAR* ppoint;
  49.     ITypeInfo FAR* ptinfo;
  50. extern INTERFACEDATA NEAR g_idataCPoint;
  51.     if((ppoint = new FAR CPoint()) == NULL)
  52.       return NULL;
  53.     ppoint->AddRef();
  54.     hresult =
  55.       CreateDispTypeInfo(&g_idataCPoint, LOCALE_SYSTEM_DEFAULT, &ptinfo);
  56.     if(hresult != NOERROR)
  57.       goto LError0;
  58.     ppoint->m_ptinfo = ptinfo;
  59.     return ppoint;
  60. LError0:;
  61.     ppoint->Release();
  62.     return NULL;
  63. }
  64. //---------------------------------------------------------------------
  65. //                     IUnknown Methods
  66. //---------------------------------------------------------------------
  67. STDMETHODIMP
  68. CPoint::QueryInterface(REFIID riid, void FAR* FAR* ppv)
  69. {
  70.     if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IDispatch)){
  71.       *ppv = this;
  72.       AddRef();
  73.       return NOERROR;
  74.     }
  75.     *ppv = NULL;
  76.     return E_NOINTERFACE;
  77. }
  78. STDMETHODIMP_(unsigned long)
  79. CPoint::AddRef(void)
  80. {
  81.     return ++m_refs;
  82. }
  83. STDMETHODIMP_(unsigned long)
  84. CPoint::Release(void)
  85. {
  86.     if(--m_refs == 0){
  87.       if(m_ptinfo != NULL){
  88. m_ptinfo->Release();
  89.       }
  90.       delete this;
  91.       return 0;
  92.     }
  93.     return m_refs;
  94. }
  95. //---------------------------------------------------------------------
  96. //                     IDispatch methods
  97. //---------------------------------------------------------------------
  98. STDMETHODIMP
  99. CPoint::GetTypeInfoCount(unsigned int FAR* pctinfo)
  100. {
  101.     // this object has a single *introduced* interface
  102.     //
  103.     *pctinfo = 1;
  104.     return NOERROR;
  105. }
  106. STDMETHODIMP
  107. CPoint::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
  108. {
  109.     UNUSED(lcid);
  110.     if(itinfo != 0)
  111.       return DISP_E_BADINDEX;
  112.     m_ptinfo->AddRef();
  113.     *pptinfo = m_ptinfo;
  114.     return NOERROR;
  115. }
  116. /***
  117. *HRESULT CPoint::GetIDsOfNames(REFIID, char**, unsigned int, LCID, DISPID*)
  118. *Purpose:
  119. *  This method translates the given array of names to a corresponding
  120. *  array of DISPIDs.
  121. *
  122. *  Index 0 of the name array is the member name, and indices 1-N if
  123. *  present represent named parameters on that member.
  124. *
  125. *  The local ID ('lcid') is unused by this naive implementation. A more
  126. *  sophisticated implementation, sensitive to localization and natural
  127. *  language support would use the locale ID to interpret the given names
  128. *  in a correct locale specific context.
  129. *
  130. *Entry:
  131. *  rgszNames = pointer to an array of names
  132. *  cNames = the number of names in the rgszNames array
  133. *  lcid = the callers locale ID
  134. *
  135. *Exit:
  136. *  return value = HRESULT
  137. *  rgid = array of name IDs corresponding to the rgszNames array
  138. *    this array will contain -1 for each entry that is not known.
  139. *
  140. ***********************************************************************/
  141. STDMETHODIMP
  142. CPoint::GetIDsOfNames(
  143.     REFIID riid,
  144.     OLECHAR FAR* FAR* rgszNames,
  145.     unsigned int cNames,
  146.     LCID lcid,
  147.     DISPID FAR* rgdispid)
  148. {
  149.     UNUSED(lcid);
  150.     if(!IsEqualIID(riid,IID_NULL))
  151.       return DISP_E_UNKNOWNINTERFACE;
  152.     return DispGetIDsOfNames(m_ptinfo, rgszNames, cNames, rgdispid);
  153. }
  154. /***
  155. *HRESULT CPoint::Invoke(...)
  156. *Purpose:
  157. *  Dispatch a method or property request for objects of type CPoint.
  158. *
  159. *  see the IDispatch document for more information, and a general
  160. *  description of this method.
  161. *
  162. *Entry:
  163. *  dispidMember = the DISPID of the member being requested
  164. *
  165. *  riid = reference to the interface ID of the interface on this object
  166. *    that the requested member belongs to. IID_NULL means to interpret
  167. *    the member as belonging to the implementation defined "default"
  168. *    or "primary" interface.
  169. *
  170. *  lcid = the caller's locale ID
  171. *
  172. *  wFlags = flags indicating the type of access being requested
  173. *
  174. *  pdispparams = pointer to the DISPPARAMS struct containing the
  175. *    requested members arguments (if any) and its named parameter
  176. *    DISPIDs (if any).
  177. *
  178. *Exit:
  179. *  return value = HRESULT
  180. *   see the IDispatch spec for a description of possible success codes.
  181. *
  182. *  pvarResult = pointer to a caller allocated VARIANT containing
  183. *    the members return value (if any).
  184. *
  185. *  pexcepinfo = caller allocated exception info structure, this will
  186. *    be filled in only if an exception was raised that must be passed
  187. *    up through Invoke to an enclosing handler.
  188. *
  189. *  puArgErr = pointer to a caller allocated UINT, that will contain the
  190. *    index of the offending argument if a DISP_E_TYPEMISMATCH error
  191. *    was returned indicating that one of the arguments was of an
  192. *    incorrect type and/or could not be reasonably coerced to a proper
  193. *    type.
  194. *
  195. ***********************************************************************/
  196. STDMETHODIMP
  197. CPoint::Invoke(
  198.     DISPID dispidMember,
  199.     REFIID riid,
  200.     LCID lcid,
  201.     unsigned short wFlags,
  202.     DISPPARAMS FAR* pdispparams,
  203.     VARIANT FAR* pvarResult,
  204.     EXCEPINFO FAR* pexcepinfo,
  205.     unsigned int FAR* puArgErr)
  206. {
  207.     UNUSED(lcid);
  208.     if(!IsEqualIID(riid, IID_NULL))
  209.       return DISP_E_UNKNOWNINTERFACE;
  210.     return DispInvoke(
  211.       this, m_ptinfo,
  212.       dispidMember, wFlags, pdispparams,
  213.       pvarResult, pexcepinfo, puArgErr);
  214. }
  215. //---------------------------------------------------------------------
  216. //                       Introduced methods
  217. //---------------------------------------------------------------------
  218. short METHODCALLTYPE EXPORT
  219. CPoint::GetX()
  220. {
  221.     return m_x;
  222. }
  223. void METHODCALLTYPE EXPORT
  224. CPoint::SetX(short x)
  225. {
  226.     m_x = x;
  227. }
  228. short METHODCALLTYPE EXPORT
  229. CPoint::GetY()
  230. {
  231.     return m_y;
  232. }
  233. void METHODCALLTYPE EXPORT
  234. CPoint::SetY(short y)
  235. {
  236.     m_y = y;
  237. }
  238. //---------------------------------------------------------------------
  239. //         Implementation of the CPoint Class Factory
  240. //---------------------------------------------------------------------
  241. CPointCF::CPointCF()
  242. {
  243.     m_refs = 0;
  244. }
  245. IClassFactory FAR*
  246. CPointCF::Create()
  247. {
  248.     CPointCF FAR* pCF;
  249.     if((pCF = new FAR CPointCF()) == NULL)
  250.       return NULL;
  251.     pCF->AddRef();
  252.     return pCF;
  253. }
  254. STDMETHODIMP
  255. CPointCF::QueryInterface(REFIID riid, void FAR* FAR* ppv) 
  256. {
  257.     if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)){
  258.       *ppv = this;
  259.       ++m_refs;
  260.       return NOERROR;
  261.     }
  262.     *ppv = NULL;
  263.     return E_NOINTERFACE;
  264. }
  265. STDMETHODIMP_(unsigned long)
  266. CPointCF::AddRef(void)
  267. {
  268.     return ++m_refs;
  269. }
  270. STDMETHODIMP_(unsigned long)
  271. CPointCF::Release(void)
  272. {
  273.     if(--m_refs == 0){
  274.       delete this;
  275.       return 0;
  276.     }
  277.     return m_refs;
  278. }
  279. STDMETHODIMP
  280. CPointCF::CreateInstance(
  281.     IUnknown FAR* punkOuter,
  282.     REFIID riid,
  283.     void FAR* FAR* ppv)
  284. {
  285.     HRESULT hresult;
  286.     CPoint FAR *ppoint;
  287.     UNUSED(punkOuter);
  288.     if((ppoint = CPoint::Create()) == NULL){
  289.       *ppv = NULL;
  290.       return E_OUTOFMEMORY;
  291.     }
  292.     hresult = ppoint->QueryInterface(riid, ppv);
  293.     ppoint->Release();
  294.     return hresult;
  295. }
  296. STDMETHODIMP
  297. #ifdef _MAC
  298. CPointCF::LockServer(unsigned long fLock)
  299. #else
  300. CPointCF::LockServer(BOOL fLock)
  301. #endif
  302. {
  303.     UNUSED(fLock);
  304.     return NOERROR;
  305. }