码迷,mamicode.com
首页 > 其他好文 > 详细

<COM原理和应用>第七章的ITextObject代码是什么?

时间:2016-08-12 13:06:05      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

?

7章中有如下的描述:
-----------------------------------
为了在程序中使用"Text.Object"文本对象,我们利用ClassWizard引入文本对象控制类,ClassWizard会为我们创建

一个COleDispatchDriver的派生类ITextObject,在后面代码中我们将会看到ITextObject类的用法。
--------------------------------------

可是在书中自带的源代码中找不到相关的代码。我自己创建了一个继承自COleDispatchDriver的类,编译的时候提示:?
---------------------------------------------------------------
‘GetText‘?:?is?not?a?member?of?‘ITextObject‘
-----------------------------------------------------------------
因为GetTextCTextObject类的自定义属性。

这个COleDispatchDriver的派生类ITextObject到底该怎么写才可以使CompFile项目正常运行那?

【解决方法】

首先是如何定义ITextObject的属性:

在类视图中找到ITextObject接口,右键选择Add property, 技术分享

?

进行如下的输入,属性的名字我用了MyText, 没有用书里面的Text, 原理是一样的,点击Next.

?

技术分享

使用默认的不用改。点击 Finish.

技术分享

?

现在来看生成结果:

打开.idl 文件。

技术分享

打开TextObject.h文件。

(注意里面SetMyText的参数类是指针类型,因为我用默认的非指针传值总是不正确,所以这里自己改成了指针类型,传值就正常了。)

技术分享

?

?

打开TextObject.cpp文件。

第一处:DISP_PROPERTY_EX_ID中

技术分享

第二处:

技术分享

?

将TextComp项目编译成功,并且注册成功后,就可以在CompFile项目中使用它了。

为了与例子中给出的代码兼容,需要创建一个TextComp.h 文件,创建步骤如下:

在项目上右键选择 Add Class,选择MFC Class From TypeLib, 然后点击 Add.

技术分享

选择Registry(选择编译自动生成的tbl文件也可以),然后找到刚刚注册的TextComp组件,选择ITextObject接口,添加到右边。类的名字我用了CTextObject_Wrapper,而没有用代码例子中的ITextObject,这样可读性好一些。文件用了与代码例子兼容的TextComp.h。点击Finish。

技术分享

打开生成的TextComp.h文件,可以看到继承自COleDispatchDriver的类已经被创建了,操作属性相关的代码也被自动生成了。

技术分享

ReadWrite.cpp文件中的ReadDirectory函数需要改一下,以下是需要改的部分。在这里需要注意VARIANT变量的用法,使用前需要调用VariantInit,使用后需要调用VariantClear,这里说的:https://msdn.microsoft.com/en-us/library/windows/desktop/dd373687(v=vs.85).aspx

?

????????????if(file.ReadString(szData, 511)) {

TRACE("%s\n", szData);

VERIFY(pStg->CreateStream(T2COLE(szStreamName),

STGM_CREATE | STGM_READWRITE |

???????????? ???? STGM_SHARE_EXCLUSIVE,

0, 0, &pStream) == S_OK);

ASSERT(pStream != NULL);

???????????? // Include the null terminator in the stream

???????????? CTextObject_Wrapper textObject;

???????????? VERIFY(textObject.CreateDispatch(g_clsid));

???????????? textObject.m_lpDispatch->QueryInterface(IID_IPersistStream,

???????????????? (void**) &pPersistStream);

???????????? ASSERT(pPersistStream != NULL);

????????????

???????????? char buffer[1000];

???????????? int ret = wcstombs ( buffer, szData, sizeof(buffer) );

?

???????????? BSTR bstrText = _com_util::ConvertStringToBSTR(buffer);

?

???????????? VARIANT var;

???????????? VariantInit(&var);

???????????? var.vt = VT_VARIANT;

???????????? var.bstrVal = bstrText;

?

???????????? //textObject.SetMyText(COleVariant(bstrText));

???????????? textObject.SetMyText(var);

???????????? VariantClear(&var);

???????????? pPersistStream->Save(pStream, TRUE);

???????????? pPersistStream->Release();

pStream->Release();

?

<COM原理和应用>第七章的ITextObject代码是什么?

标签:

原文地址:http://www.cnblogs.com/time-is-life/p/5764323.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!