简化COM对象属性操作

在开发过程中,经常需要对COM对象的属性进行操作。这通常是一个繁琐且容易出错的过程。幸运的是,Konstantin Boukreev撰写的《使用OLE自动化设置属性》一文为提供了一种解决方案。他编写了一个ActiveX控件,使得能够通过IDispatch接口在VB IDE属性浏览器中操作属性。

受到这篇文章的启发,决定创建一个COM对象,用于程序属性的操作,并通过前面描述的ActiveX控件进行编辑。首先需要提到的是属性COM对象中的以下宏:

DECLARE_CLASSFACTORY_SINGLETON (CObserverDS)

这样做是为了确保属性COM对象在每个进程中是唯一的。接下来遇到的问题是属性中包含了连接字符串。将其作为字符串编辑并不是一个好的风格。例如,如果使用OLE DB或ADO,就知道常见的数据链接属性选择对话框。

幸运的是,Konstantin Boukreev提供了一种简单的方式来将自己的类型添加到他的属性浏览器中。只需要编写自己的类来实现数据字段点击。为连接字符串属性做了如下实现:

#include "oledb.h" #include "msdasc.h" class kPropertyDataSource : public kPropertyCustom { public: kPropertyDataSource(kObserver* pObserver) : kPropertyCustom(pObserver) {} protected: bool OnClickImpl() { USES_CONVERSION; CComBSTR bstr; GetText(bstr); IUnknown * pUnkDataSource = NULL; IDataInitialize * pIDataInitialize = NULL; IDBPromptInitialize * pIDBPromptInitialize = NULL; CoCreateInstance(CLSID_DataLinks, NULL, CLSCTX_INPROC_SERVER, IID_IDataInitialize, (void**)&pIDataInitialize); try { pIDataInitialize->GetDataSource(NULL, CLSCTX_INPROC_SERVER, bstr, IID_IUnknown, (IUnknown**)&pUnkDataSource); } catch (...) { } CoCreateInstance(CLSID_DataLinks, NULL, CLSCTX_INPROC_SERVER, IID_IDBPromptInitialize, (void**)&pIDBPromptInitialize); pIDBPromptInitialize->PromptDataSource(NULL, GetDesktopWindow(), DBPROMPTOPTIONS_PROPERTYSHEET, 0, NULL, NULL, IID_IUnknown, (IUnknown**)&pUnkDataSource); pIDataInitialize->GetInitializationString(pUnkDataSource, false, &bstr); if (pIDBPromptInitialize) pIDBPromptInitialize->Release(); if (pIDataInitialize) pIDataInitialize->Release(); if (pUnkDataSource) pUnkDataSource->Release(); return SetText(bstr) == S_OK; }; };

这段代码需要添加到kProperty.h文件中。还需要修改kObserver2.cpp文件,添加以下内容:

else if (InlineIsEqualGUID(pta->guid, GUID_DATASOURCE)) { pprop = new kPropertyDataSource(this); hr = S_OK; }

并且需要在propguids.h文件中添加GUID_DATASOURCE定义:

DEFINE_GUID(GUID_DATASOURCE, 0x9c49625b, 0xd1f9, 0x44c8, 0x84, 0xf7, 0xc1, 0x59, 0x36, 0x86, 0x4b, 0x6a);

将所有更改的文件放在了ModifiedFiles文件夹中。编写了一个测试属性COM对象,它只有一个属性——connectionString。但请注意,它的类型在idl文件中定义,并带有自己的guid:

[uuid(9c49625b-d1f9-44c8-84f7-c15936864b6a), version(1.0)] typedef BSTR DATASOURCEBSTR;
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485