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