TextObject.cpp
上传用户:biuytresa
上传日期:2007-12-07
资源大小:721k
文件大小:5k
源码类别:

DNA

开发平台:

Visual C++

  1. // TextObject.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "TextComp.h"
  5. #include "TextObject.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CTextObject
  13. IMPLEMENT_DYNCREATE(CTextObject, CCmdTarget)
  14. CTextObject::CTextObject()
  15. {
  16. EnableAutomation();
  17. // To keep the application running as long as an OLE automation 
  18. // object is active, the constructor calls AfxOleLockApp.
  19. AfxOleLockApp();
  20. m_pText = NULL;
  21. }
  22. CTextObject::~CTextObject()
  23. {
  24. if(m_pText != NULL) {
  25. delete [] m_pText;
  26. }
  27. // To terminate the application when all objects created with
  28. //  with OLE automation, the destructor calls AfxOleUnlockApp.
  29. AfxOleUnlockApp();
  30. }
  31. void CTextObject::OnFinalRelease()
  32. {
  33. // When the last reference for an automation object is released
  34. // OnFinalRelease is called.  The base class will automatically
  35. // deletes the object.  Add additional cleanup required for your
  36. // object before calling the base class.
  37. CCmdTarget::OnFinalRelease();
  38. }
  39. BEGIN_MESSAGE_MAP(CTextObject, CCmdTarget)
  40. //{{AFX_MSG_MAP(CTextObject)
  41. // NOTE - the ClassWizard will add and remove mapping macros here.
  42. //}}AFX_MSG_MAP
  43. END_MESSAGE_MAP()
  44. BEGIN_DISPATCH_MAP(CTextObject, CCmdTarget)
  45. //{{AFX_DISPATCH_MAP(CTextObject)
  46. DISP_PROPERTY_EX(CTextObject, "Text", GetText, SetText, VT_VARIANT)
  47. //}}AFX_DISPATCH_MAP
  48. END_DISPATCH_MAP()
  49. // Note: we add support for IID_ITextObject to support typesafe binding
  50. //  from VBA.  This IID must match the GUID that is attached to the 
  51. //  dispinterface in the .ODL file.
  52. // {4F168D56-C210-11D2-9E60-00104B08CC22}
  53. static const IID IID_ITextObject =
  54. { 0x4f168d56, 0xc210, 0x11d2, { 0x9e, 0x60, 0x0, 0x10, 0x4b, 0x8, 0xcc, 0x22 } };
  55. BEGIN_INTERFACE_MAP(CTextObject, CCmdTarget)
  56. INTERFACE_PART(CTextObject, IID_IPersistStream, PersistStream)
  57. INTERFACE_PART(CTextObject, IID_ITextObject, Dispatch)
  58. END_INTERFACE_MAP()
  59. // {4F168D57-C210-11D2-9E60-00104B08CC22}
  60. IMPLEMENT_OLECREATE(CTextObject, "Text.Object", 0x4f168d57, 0xc210, 0x11d2, 0x9e, 0x60, 0x0, 0x10, 0x4b, 0x8, 0xcc, 0x22)
  61. /////////////////////////////////////////////////////////////////////////////
  62. // CTextObject message handlers
  63. VARIANT CTextObject::GetText() 
  64. {
  65. return COleVariant(m_pText).Detach();
  66. }
  67. void CTextObject::SetText(const VARIANT FAR& newValue) 
  68. {
  69. CString strTemp;
  70. ASSERT(newValue.vt == VT_BSTR);
  71. if(m_pText != NULL) {
  72. delete [] m_pText;
  73. }
  74. strTemp = newValue.bstrVal; // converts to narrow chars
  75. m_pText = new char[strTemp.GetLength() + 1];
  76. strcpy(m_pText, strTemp);
  77. }
  78. /////////////////////////////////////////////////////////////////////////////
  79. STDMETHODIMP_(ULONG) CTextObject::XPersistStream::AddRef()
  80. {
  81. METHOD_PROLOGUE(CTextObject, PersistStream)
  82. return (ULONG) pThis->ExternalAddRef();
  83. }
  84. STDMETHODIMP_(ULONG) CTextObject::XPersistStream::Release()
  85. {
  86. METHOD_PROLOGUE(CTextObject, PersistStream)
  87. return (ULONG) pThis->ExternalRelease();
  88. }
  89. STDMETHODIMP CTextObject::XPersistStream::QueryInterface(REFIID iid,
  90. void FAR* FAR* ppvObj)
  91. {
  92. METHOD_PROLOGUE(CTextObject, PersistStream)
  93. // ExternalQueryInterface looks up iid in the macro-generated tables
  94. return (HRESULT) pThis->ExternalQueryInterface(&iid, ppvObj);
  95. }
  96. /////////////////////////////////////////////////////////////////////////////
  97. STDMETHODIMP CTextObject::XPersistStream::GetClassID(LPCLSID lpClassID)
  98. {
  99. METHOD_PROLOGUE(CTextObject, PersistStream)
  100. ASSERT_VALID(pThis);
  101. *lpClassID = CTextObject::guid;
  102. return NOERROR;
  103. }
  104. STDMETHODIMP CTextObject::XPersistStream::IsDirty()
  105. {
  106. METHOD_PROLOGUE(CTextObject, PersistStream)
  107. ASSERT_VALID(pThis);
  108. return NOERROR;
  109. }
  110. STDMETHODIMP CTextObject::XPersistStream::Load(LPSTREAM pStm)
  111. {
  112. ULONG nLength;
  113.     STATSTG statstg;
  114. METHOD_PROLOGUE(CTextObject, PersistStream)
  115. ASSERT_VALID(pThis);
  116. if(pThis->m_pText != NULL) {
  117. delete [] pThis->m_pText;
  118. }
  119. // don't need to free statstg.pwcsName because of NONAME flag
  120. VERIFY(pStm->Stat(&statstg, STATFLAG_NONAME) == NOERROR);
  121. int nSize = statstg.cbSize.LowPart; // assume < 4 GB
  122. if(nSize > 0) {
  123. pThis->m_pText = new char[nSize];
  124. pStm->Read(pThis->m_pText, nSize, &nLength);
  125. }
  126. return NOERROR;
  127. }
  128. STDMETHODIMP CTextObject::XPersistStream::Save(LPSTREAM pStm, BOOL fClearDirty)
  129. {
  130. METHOD_PROLOGUE(CTextObject, PersistStream)
  131. ASSERT_VALID(pThis);
  132. int nSize = strlen(pThis->m_pText) + 1;
  133. pStm->Write(pThis->m_pText, nSize, NULL);
  134. return NOERROR;
  135. }
  136. STDMETHODIMP CTextObject::XPersistStream::GetSizeMax(ULARGE_INTEGER FAR* pcbSize)
  137. {
  138. METHOD_PROLOGUE(CTextObject, PersistStream)
  139. ASSERT_VALID(pThis);
  140. pcbSize->LowPart = strlen(pThis->m_pText) + 1;
  141. pcbSize->HighPart = 0; // assume < 4 GB
  142. return NOERROR;
  143. }