📄 text.cpp
字号:
// Text.cpp : 实现文件
//
#include "stdafx.h"
#include "PersistText.h"
#include "Text.h"
// CText
IMPLEMENT_DYNCREATE(CText, CCmdTarget)
CText::CText()
: m_pchText(NULL)
{
EnableAutomation();
// 为了使应用程序在 OLE 自动化对象处于活动状态时保持
// 运行,构造函数调用 AfxOleLockApp。
AfxOleLockApp();
}
CText::~CText()
{
// 为了在用 OLE 自动化创建所有对象后终止应用程序,
// 析构函数调用 AfxOleUnlockApp。
AfxOleUnlockApp();
}
void CText::OnFinalRelease()
{
// 当释放自动化对象的最后一个引用
//时调用 OnFinalRelease。基类将自动
//删除该对象。请在调用基类之前添加
//对象所需的其他清理。
CCmdTarget::OnFinalRelease();
}
BEGIN_MESSAGE_MAP(CText, CCmdTarget)
END_MESSAGE_MAP()
BEGIN_DISPATCH_MAP(CText, CCmdTarget)
DISP_PROPERTY_EX(CText, "Text", GetText, SetText, VT_VARIANT)
END_DISPATCH_MAP()
// 注意:我们添加 IID_IText 支持
//以支持来自 VBA 的类型安全绑定。此 IID 必须同附加到 .IDL 文件中的
//调度接口的 GUID 匹配。
// {F676D9C6-9630-401F-81AB-90E356EAEE16}
static const IID IID_IText =
{ 0xF676D9C6, 0x9630, 0x401F, { 0x81, 0xAB, 0x90, 0xE3, 0x56, 0xEA, 0xEE, 0x16 } };
BEGIN_INTERFACE_MAP(CText, CCmdTarget)
INTERFACE_PART(CText, IID_IText, Dispatch)
END_INTERFACE_MAP()
// {8E6ED099-B0A5-484A-A183-6A65700BEDC8}
IMPLEMENT_OLECREATE_FLAGS(CText, "PersistText.Text", afxRegApartmentThreading, 0x8e6ed099, 0xb0a5, 0x484a, 0xa1, 0x83, 0x6a, 0x65, 0x70, 0xb, 0xed, 0xc8)
// CText 消息处理程序
VARIANT CText::GetText()
{
return COleVariant(m_pchText).Detach();
}
void CText::SetText(const VARIANT FAR& newValue)
{
CString strTemp;
ASSERT(newValue.vt == VT_BSTR);
if(m_pchText != NULL) {
delete [] m_pchText;
}
strTemp = newValue.bstrVal; // converts to narrow chars
m_pchText = new char[strTemp.GetLength() + 1];
strcpy(m_pchText, strTemp);
}
STDMETHODIMP_(ULONG) CText::XPersistStream::AddRef()
{
METHOD_PROLOGUE(CText, PersistStream)
return (ULONG) pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) CText::XPersistStream::Release()
{
METHOD_PROLOGUE(CText, PersistStream)
return (ULONG) pThis->ExternalRelease();
}
STDMETHODIMP CText::XPersistStream::QueryInterface(REFIID iid,
void FAR* FAR* ppvObj)
{
METHOD_PROLOGUE(CText, PersistStream)
// ExternalQueryInterface looks up iid in the macro-generated tables
return (HRESULT) pThis->ExternalQueryInterface(&iid, ppvObj);
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CText::XPersistStream::GetClassID(LPCLSID lpClassID)
{
TRACE("Entering CText::XPersistStream::GetClassID\n");
METHOD_PROLOGUE(CText, PersistStream)
ASSERT_VALID(pThis);
*lpClassID = CText::guid;
return NOERROR;
}
STDMETHODIMP CText::XPersistStream::IsDirty()
{
TRACE("Entering CText::XPersistStream::IsDirty\n");
METHOD_PROLOGUE(CText, PersistStream)
ASSERT_VALID(pThis);
return NOERROR;
}
STDMETHODIMP CText::XPersistStream::Load(LPSTREAM pStm)
{
ULONG nLength;
STATSTG statstg;
METHOD_PROLOGUE(CText, PersistStream)
ASSERT_VALID(pThis);
if(pThis->m_pchText != NULL) {
delete [] pThis->m_pchText;
}
// don't need to free statstg.pwcsName because of NONAME flag
VERIFY(pStm->Stat(&statstg, STATFLAG_NONAME) == NOERROR);
int nSize = statstg.cbSize.LowPart; // assume < 4 GB
if(nSize > 0) {
pThis->m_pchText = new char[nSize];
pStm->Read(pThis->m_pchText, nSize, &nLength);
}
return NOERROR;
}
STDMETHODIMP CText::XPersistStream::Save(LPSTREAM pStm, BOOL fClearDirty)
{
METHOD_PROLOGUE(CText, PersistStream)
ASSERT_VALID(pThis);
int nSize = strlen(pThis->m_pchText) + 1;
pStm->Write(pThis->m_pchText, nSize, NULL);
return NOERROR;
}
STDMETHODIMP CText::XPersistStream::GetSizeMax(ULARGE_INTEGER FAR* pcbSize)
{
TRACE("Entering CText::XPersistStream::GetSizeMax\n");
METHOD_PROLOGUE(CText, PersistStream)
ASSERT_VALID(pThis);
pcbSize->LowPart = strlen(pThis->m_pchText) + 1;
pcbSize->HighPart = 0; // assume < 4 GB
return NOERROR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -