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

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

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

这个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代码是什么?的更多相关文章

  1. 2017.11.1 微型计算机原理与接口技术-----第七章 中断系统与8237A DMA控制器

    第七章 微型计算机原理与接口技术-----中断系统与8237A DMA控制器 (1)数据传送的两种方式:中断方式和直接存储器存取方式(DMA):中断是微处理器与外部设备交换信息的一种方式:DMA是存储 ...

  2. 数据库原理 第七章 数据库设计和ER模型

    第七章讲述一个E-R设计如何转换成一个关系模式的集合以及如何在该设计中找到某些约束. 1.概念设计定义了数据库中表示的实体.实体的属性.实体之间的联系,以及实体和联系上的约束 在设计一个数据库模型的时 ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 (41) ------ 第七章 使用对象服务之标识关系中使用依赖实体与异步查询保存

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-7  标识关系中使用依赖实体 问题 你想在标识关系中插入,更新和删除一个依赖实体 ...

  5. 第七章 LED将为我们闪烁:控制发光二极管

     第七章 LED将为我们闪烁:控制发光二极管 本章我们将会看到一个完整的linux驱动程序,通过linux驱动程序控制LED的四个小灯,通俗的说就是通过向linux驱动程序来控制LED小灯的开关.用到 ...

  6. Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧

    第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DP ...

  7. Android群英传笔记——第七章:Android动画机制和使用技巧

    Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最 近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中 ...

  8. 【转】第七章、Linux 文件与目录管理

    原文网址:http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager.php 第七章.Linux 文件与目录管理 最近升级日期:2009/08/26 ...

  9. 第七章移动互联网与移动IP

    第七章移动互联网与移动IP 本章延续前几章节,对该章节内容进行归纳总结. 文章中的Why表示产生的背景,也就是说为什么会产生该技术,What表示该技术是什么,How表示该技术是如何使用的.以下将用字母 ...

随机推荐

  1. (实用篇)PHP中unset,array_splice删除数组中元素的区别

    php中删除数组元素是非常的简单的,但有时删除数组需要对索引进行一些排序要求我们会使用到相关的函数,这里我们来介绍使用unset,array_splice删除数组中的元素区别吧 如果要在某个数组中删除 ...

  2. js 获取浏览器可视窗口大小,滚动条高度

    // 获取窗口宽度 if (window.innerWidth) winWidth = window.innerWidth; else if ((document.body) && ( ...

  3. HTML5实现屏幕手势解锁

    HTML5实现屏幕手势解锁(转载) https://github.com/lvming6816077/H5lockHow to use? <script type="text/java ...

  4. Flex Builder读书笔记(二)——MXML

    MXML类似于HTML,它提供各种标签来定义用户界面,但是它比HTML的结构更为严格,并拥有跟多的应用标签.MXML不仅包括可视标签,还包括不可视标签,如web service连接.数据绑定和动画效果 ...

  5. Codeforces Round #157 (Div. 2)

    A. Little Elephant and Chess 模拟. B. Little Elephant and Magic Square 枚举左上角,计算其余两个位置的值,在\(3\times 3\) ...

  6. phpstorm内网远程debug

    家里用的是广电的网络,接了无线路由,在192.168.1.1里面配置了端口转发,将9001转发到192.168.1.101 ,然后在php.ini中相应的配置了xdebug, phpstorm 启动监 ...

  7. 1、C#入门第一课

    C# 读作C Sharp,所以程序文件的扩展名为.cs 新建项目-窗体应用程序 所谓的Visual C#就是指的可视化编程,主要在设计窗口布置好自己的控件(一些具有一定功能的小部件,例如如可以点击的按 ...

  8. JavaScript 中的window.event代表的是事件的状态,jquery事件对象属性,jquery中如何使用event.target

    http://wenda.haosou.com/q/1373868839069215 http://kylines.iteye.com/blog/1660236 http://www.cnblogs. ...

  9. C#中get和set的写法

    class program{ private string name; public string XXXXXX{ get{return name;} set{name=value;} } } 在C# ...

  10. java 网络编程复习(转)

    好久没有看过Java网络编程了,现在刚好公司有机会接触,顺便的拾起以前的东西 参照原博客:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942 ...