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

Windows编程

开发平台:

Visual C++

  1. //**********************************************************************
  2. // File name: IDO.CPP
  3. //
  4. //    Implementation file for the CDataObject Class
  5. //
  6. // Functions:
  7. //
  8. //    See ido.h for a list of member functions.
  9. //
  10. // Copyright (c) 1993-1997 Microsoft Corporation. All rights reserved.
  11. //**********************************************************************
  12. #include "pre.h"
  13. #include "obj.h"
  14. #include "ido.h"
  15. #include "app.h"
  16. #include "doc.h"
  17. //**********************************************************************
  18. //
  19. // CDataObject::QueryInterface
  20. //
  21. // Purpose:
  22. //
  23. //
  24. // Parameters:
  25. //
  26. //      REFIID riid         -   Interface being queried for.
  27. //
  28. //      LPVOID FAR *ppvObj  -   Out pointer for the interface.
  29. //
  30. // Return Value:
  31. //
  32. //      S_OK            - Success
  33. //      E_NOINTERFACE   - Failure
  34. //
  35. // Function Calls:
  36. //      Function                    Location
  37. //
  38. //      CSimpSvrObj::QueryInterface OBJ.CPP
  39. //
  40. // Comments:
  41. //
  42. //
  43. //********************************************************************
  44. STDMETHODIMP CDataObject::QueryInterface ( REFIID riid, LPVOID FAR* ppvObj)
  45. {
  46. OutputDebugString("In CDataObject::QueryInterfacern");
  47. return m_lpObj->QueryInterface(riid, ppvObj);
  48. };
  49. //**********************************************************************
  50. //
  51. // CDataObject::AddRef
  52. //
  53. // Purpose:
  54. //
  55. //      Increments the reference count on CClassFactory and the application
  56. //      object.
  57. //
  58. // Parameters:
  59. //
  60. //      None
  61. //
  62. // Return Value:
  63. //
  64. //      The Reference count on CDataObject
  65. //
  66. // Function Calls:
  67. //      Function                    Location
  68. //
  69. //      OuputDebugString            Windows API
  70. //      CSimpSvrObj::AddRef         OBJ.CPP
  71. //
  72. // Comments:
  73. //
  74. //
  75. //********************************************************************
  76. STDMETHODIMP_(ULONG) CDataObject::AddRef ()
  77. {
  78. OutputDebugString("In CDataObject::AddRefrn");
  79. ++m_nCount;
  80. return m_lpObj->AddRef();
  81. };
  82. //**********************************************************************
  83. //
  84. // CDataObject::Release
  85. //
  86. // Purpose:
  87. //
  88. //      Decrements the reference count of CDataObject
  89. //
  90. // Parameters:
  91. //
  92. //      None
  93. //
  94. // Return Value:
  95. //
  96. //      The new reference count
  97. //
  98. // Function Calls:
  99. //      Function                    Location
  100. //
  101. //      OutputDebugString           Windows API
  102. //      CSimpSvrObj::Release        OBJ.CPP
  103. //
  104. // Comments:
  105. //
  106. //
  107. //********************************************************************
  108. STDMETHODIMP_(ULONG) CDataObject::Release ()
  109. {
  110. OutputDebugString("In CDataObject::Releasern");
  111. --m_nCount;
  112. return m_lpObj->Release();
  113. };
  114. //**********************************************************************
  115. //
  116. // CDataObject::QueryGetData
  117. //
  118. // Purpose:
  119. //
  120. //      Called to determine if our object supports a particular
  121. //      FORMATETC.
  122. //
  123. // Parameters:
  124. //
  125. //      LPFORMATETC pformatetc  - Pointer to the FORMATETC being queried for.
  126. //
  127. // Return Value:
  128. //
  129. //      DATA_E_FORMATETC    - The FORMATETC is not supported
  130. //      S_OK                - The FORMATETC is supported.
  131. //
  132. //
  133. // Function Calls:
  134. //      Function                    Location
  135. //
  136. //      OutputDebugString           Windows API
  137. //                   OLE API
  138. //
  139. // Comments:
  140. //
  141. //
  142. //********************************************************************
  143. STDMETHODIMP CDataObject::QueryGetData  ( LPFORMATETC pformatetc )
  144. {
  145. SCODE sc = DATA_E_FORMATETC;
  146. OutputDebugString("In CDataObject::QueryGetDatarn");
  147. // check the validity of the formatetc.
  148. if ( (pformatetc->cfFormat == CF_METAFILEPICT)  &&
  149.  (pformatetc->dwAspect == DVASPECT_CONTENT) &&
  150.  (pformatetc->tymed == TYMED_MFPICT) )
  151. sc = S_OK;
  152. return sc;
  153. };
  154. //**********************************************************************
  155. //
  156. // CDataObject::DAdvise
  157. //
  158. // Purpose:
  159. //
  160. //      Called by the container when it would like to be notified of
  161. //      changes in the object data.
  162. //
  163. // Parameters:
  164. //
  165. //      FORMATETC FAR* pFormatetc   - The format the container is interested in.
  166. //
  167. //      DWORD advf                  - The type of advise to be set up.
  168. //
  169. //      LPADVISESINK pAdvSink       - Pointer to the containers IAdviseSink
  170. //
  171. //      DWORD FAR* pdwConnection    - Out parameter to return a unique connection id.
  172. //
  173. // Return Value:
  174. //
  175. //      passed on from IDataAdviseHolder
  176. //
  177. // Function Calls:
  178. //      Function                    Location
  179. //
  180. //      OutputDebugString           Windows API
  181. //      CreateDataAdviseHolder      OLE API
  182. //      IDataAdviseHolder::Advise   OLE API
  183. //
  184. // Comments:
  185. //
  186. //
  187. //********************************************************************
  188. STDMETHODIMP CDataObject::DAdvise  ( FORMATETC FAR* pFormatetc, DWORD advf,
  189.  LPADVISESINK pAdvSink, DWORD FAR* pdwConnection)
  190. {
  191. OutputDebugString("In CDataObject::DAdvisern");
  192. // if no DataAdviseHolder has been created, then create one.
  193. if (!m_lpObj->m_lpDataAdviseHolder)
  194. CreateDataAdviseHolder(&m_lpObj->m_lpDataAdviseHolder);
  195. // pass on to the DataAdviseHolder
  196. return m_lpObj->m_lpDataAdviseHolder->Advise( this, pFormatetc, advf,
  197.   pAdvSink, pdwConnection);
  198. }
  199. //**********************************************************************
  200. //
  201. // CDataObject::GetData
  202. //
  203. // Purpose:
  204. //
  205. //      Returns the data in the format specified in pformatetcIn.
  206. //
  207. // Parameters:
  208. //
  209. //      LPFORMATETC pformatetcIn    -   The format requested by the caller
  210. //
  211. //      LPSTGMEDIUM pmedium         -   The medium requested by the caller
  212. //
  213. // Return Value:
  214. //
  215. //      DATA_E_FORMATETC    - Format not supported
  216. //      S_OK                - Success
  217. //
  218. // Function Calls:
  219. //      Function                        Location
  220. //
  221. //      OutputDebugString               Windows API
  222. //      CSimpSvrObj::GetMetaFilePict()  OBJ.CPP
  223. //                       OLE API
  224. //
  225. // Comments:
  226. //
  227. //
  228. //********************************************************************
  229. STDMETHODIMP CDataObject::GetData  ( LPFORMATETC pformatetcIn, LPSTGMEDIUM pmedium )
  230. {
  231. SCODE sc = DATA_E_FORMATETC;
  232. OutputDebugString("In CDataObject::GetDatarn");
  233. // Check to the FORMATETC and fill pmedium if valid.
  234. if ( (pformatetcIn->cfFormat == CF_METAFILEPICT)  &&
  235.  (pformatetcIn->dwAspect == DVASPECT_CONTENT) &&
  236.  (pformatetcIn->tymed & TYMED_MFPICT) )
  237. {
  238. HANDLE hmfPict = m_lpObj->GetMetaFilePict();
  239. pmedium->tymed = TYMED_MFPICT;
  240. pmedium->hGlobal = hmfPict;
  241. pmedium->pUnkForRelease = NULL;
  242. sc = S_OK;
  243. }
  244. return  sc ;
  245. };
  246. //**********************************************************************
  247. //
  248. // CDataObject::DUnadvise
  249. //
  250. // Purpose:
  251. //
  252. //      Breaks down an Advise connection.
  253. //
  254. // Parameters:
  255. //
  256. //      DWORD dwConnection  - Advise connection ID.
  257. //
  258. // Return Value:
  259. //
  260. //      Returned from the DataAdviseHolder.
  261. //
  262. // Function Calls:
  263. //      Function                    Location
  264. //
  265. //      OutputDebugString           Windows API
  266. //      IDataAdviseHolder::Unadvise OLE
  267. //
  268. // Comments:
  269. //
  270. //
  271. //********************************************************************
  272. STDMETHODIMP CDataObject::DUnadvise  ( DWORD dwConnection)
  273. {
  274. OutputDebugString("In CDataObject::DUnadvisern");
  275. return m_lpObj->m_lpDataAdviseHolder->Unadvise(dwConnection);
  276. };
  277. //**********************************************************************
  278. //
  279. // CDataObject::GetDataHere
  280. //
  281. // Purpose:
  282. //
  283. //      Called to get a data format in a caller supplied location
  284. //
  285. // Parameters:
  286. //
  287. //      LPFORMATETC pformatetc  - FORMATETC requested
  288. //
  289. //      LPSTGMEDIUM pmedium     - Medium to return the data
  290. //
  291. // Return Value:
  292. //
  293. //      DATA_E_FORMATETC    - We don't support the requested format
  294. //
  295. // Function Calls:
  296. //      Function                    Location
  297. //
  298. //      OutputDebugString           Windows API
  299. //
  300. // Comments:
  301. //
  302. //      In this simple implementation, we don't really support this
  303. //      method, we just always return DATA_E_FORMATETC.
  304. //
  305. //********************************************************************
  306. STDMETHODIMP CDataObject::GetDataHere  ( LPFORMATETC pformatetc,
  307.  LPSTGMEDIUM pmedium )
  308. {
  309. OutputDebugString("In CDataObject::GetDataHerern");
  310. return  DATA_E_FORMATETC;
  311. };
  312. //**********************************************************************
  313. //
  314. // CDataObject::GetCanonicalFormatEtc
  315. //
  316. // Purpose:
  317. //
  318. //      Returns a FORMATETC that is equivalent to the one passed in.
  319. //
  320. // Parameters:
  321. //
  322. //      LPFORMATETC pformatetc      - FORMATETC to be tested.
  323. //
  324. //      LPFORMATETC pformatetcOut   - Out ptr for returned FORMATETC.
  325. //
  326. // Return Value:
  327. //
  328. //      DATA_S_SAMEFORMATETC    - Use the same formatetc as was passed.
  329. //
  330. // Function Calls:
  331. //      Function                    Location
  332. //
  333. //      OutputDebugString           Windows API
  334. //      CoGetMalloc                 OLE API
  335. //      IMalloc::Alloc              OLE
  336. //      IMalloc::Release            OLE
  337. //      _fmemcpy                    C run-time
  338. //
  339. // Comments:
  340. //
  341. //
  342. //********************************************************************
  343. STDMETHODIMP CDataObject::GetCanonicalFormatEtc  ( LPFORMATETC pformatetc,
  344.    LPFORMATETC pformatetcOut)
  345. {
  346. HRESULT hresult;
  347. OutputDebugString("In CDataObject::GetCanonicalFormatEtcrn");
  348. if (!pformatetcOut)
  349. return E_INVALIDARG;
  350. /* OLE2NOTE: we must make sure to set all out parameters to NULL. */
  351. pformatetcOut->ptd = NULL;
  352. if (!pformatetc)
  353. return E_INVALIDARG;
  354. // OLE2NOTE: we must validate that the format requested is supported
  355. if ((hresult = QueryGetData(pformatetc)) != NOERROR)
  356. return hresult;
  357. /* OLE2NOTE: an app that is insensitive to target device (as
  358. **    SimpSvr is) should fill in the lpformatOut parameter
  359. **    but NULL out the "ptd" field; it should return NOERROR if the
  360. **    input formatetc->ptd what non-NULL. this tells the caller
  361. **    that it is NOT necessary to maintain a separate screen
  362. **    rendering and printer rendering. if should return
  363. **    DATA_S_SAMEFORMATETC if the input and output formatetc's are
  364. **    identical.
  365. */
  366. *pformatetcOut = *pformatetc;
  367. if (pformatetc->ptd == NULL)
  368. return DATA_S_SAMEFORMATETC;
  369. else
  370. {
  371. pformatetcOut->ptd = NULL;
  372. return NOERROR;
  373. }
  374. };
  375. //**********************************************************************
  376. //
  377. // CDataObject::SetData
  378. //
  379. // Purpose:
  380. //
  381. //      Called to set the data for the object.
  382. //
  383. // Parameters:
  384. //
  385. //      LPFORMATETC pformatetc      - the format of the data being passed
  386. //
  387. //      STGMEDIUM FAR * pmedium     - the location of the data.
  388. //
  389. //      BOOL fRelease               - Defines the ownership of the medium
  390. //
  391. // Return Value:
  392. //
  393. //      DATA_E_FORMATETC    - Not a valid FORMATETC for this object
  394. //
  395. // Function Calls:
  396. //      Function                    Location
  397. //
  398. //      OutputDebugString           Windows API
  399. //
  400. // Comments:
  401. //
  402. //      This simple object does not support having its data set, so an
  403. //      error value is always returned.
  404. //
  405. //********************************************************************
  406. STDMETHODIMP CDataObject::SetData  ( LPFORMATETC pformatetc, STGMEDIUM FAR * pmedium,
  407.  BOOL fRelease)
  408. {
  409. OutputDebugString("In CDataObject::SetDatarn");
  410. return  DATA_E_FORMATETC ;
  411. };
  412. //**********************************************************************
  413. //
  414. // CDataObject::EnumFormatEtc
  415. //
  416. // Purpose:
  417. //
  418. //      Enumerates the formats supported by this object.
  419. //
  420. // Parameters:
  421. //
  422. //      DWORD dwDirection                       - Order of enumeration.
  423. //
  424. //      LPENUMFORMATETC FAR* ppenumFormatEtc    - Place to return a pointer
  425. //                                                to the enumerator.
  426. //
  427. // Return Value:
  428. //
  429. //      OLE_S_USEREG    - Indicates that OLE should consult the REG DB
  430. //                        to enumerate the formats.
  431. //
  432. // Function Calls:
  433. //      Function                    Location
  434. //
  435. //      OutputDebugString           Windows API
  436. //
  437. // Comments:
  438. //
  439. //
  440. //********************************************************************
  441. STDMETHODIMP CDataObject::EnumFormatEtc  ( DWORD dwDirection,
  442.    LPENUMFORMATETC FAR* ppenumFormatEtc)
  443. {
  444. OutputDebugString("In CDataObject::EnumFormatEtcrn");
  445. // need to NULL the out parameter
  446. *ppenumFormatEtc = NULL;
  447. return  OLE_S_USEREG ;
  448. };
  449. //**********************************************************************
  450. //
  451. // CDataObject::EnumDAdvise
  452. //
  453. // Purpose:
  454. //
  455. //      Returns an enumerator that enumerates all of the advises
  456. //      set up on this data object.
  457. //
  458. // Parameters:
  459. //
  460. //      LPENUMSTATDATA FAR* ppenumAdvise    - An out ptr in which to
  461. //                                            return the enumerator.
  462. //
  463. // Return Value:
  464. //
  465. //      Passed back from IDataAdviseHolder::EnumAdvise
  466. //
  467. // Function Calls:
  468. //      Function                        Location
  469. //
  470. //      OutputDebugString               Windows API
  471. //      IDAtaAdviseHolder::EnumAdvise   OLE
  472. //
  473. // Comments:
  474. //
  475. //      This just delegates to the DataAdviseHolder.
  476. //
  477. //********************************************************************
  478. STDMETHODIMP CDataObject::EnumDAdvise  ( LPENUMSTATDATA FAR* ppenumAdvise)
  479. {
  480. OutputDebugString("In CDataObject::EnumDAdvisern");
  481. // need to NULL the out parameter
  482. *ppenumAdvise = NULL;
  483. return m_lpObj->m_lpDataAdviseHolder->EnumAdvise(ppenumAdvise);
  484. };