第七章的ITextObject代码是什么?

时间:2022-12-26 10:12:58

 

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

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

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

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

【解决方法】

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

在类视图中找到ITextObject接口,右键选择Add property, 第七章的ITextObject代码是什么?

 

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

 

第七章的ITextObject代码是什么?

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

第七章的ITextObject代码是什么?

 

现在来看生成结果:

打开.idl 文件。

第七章的ITextObject代码是什么?

打开TextObject.h文件。

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

第七章的ITextObject代码是什么?

 

 

打开TextObject.cpp文件。

第一处:DISP_PROPERTY_EX_ID中

第七章的ITextObject代码是什么?

第二处:

第七章的ITextObject代码是什么?

 

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

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

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

第七章的ITextObject代码是什么?

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

第七章的ITextObject代码是什么?

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

第七章的ITextObject代码是什么?

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();