扩展属性集控件,使用通用的 OLE DB 对话框创建连接字符串属性





4.00/5 (2投票s)
2001年10月9日
1分钟阅读

56979

424
使用 OLE DB 通用对话框扩展现有的属性浏览器
引言
我曾经有一个项目,需要轻松地存储和检索属性。我发现康斯坦丁·布克列夫 (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; }
并将 GUID_DATASOURCE
定义添加到 propguids.h 文件中。
// {9C49625B-D1F9-44c8-84F7-C15936864B6A} DEFINE_GUID(GUID_DATASOURCE, 0x9c49625b, 0xd1f9, 0x44c8, 0x84, 0xf7, 0xc1, 0x59, 0x36, 0x86, 0x4b, 0x6a);
我将所有更改后的文件放在 ModifiedFiles 文件夹中。我编写了仅具有一个属性 - connectionString 的测试属性 COM 对象。但是请注意,它的类型是在 idl 文件中用它自己的 guid 定义的,如下所示
[uuid(9c49625b-d1f9-44c8-84f7-c15936864b6a), version(1.0)] typedef BSTR DATASOURCEBSTR;
我还编写了一个简单的 VB 示例
仅用于编辑我的 COM 对象的 connectionString
属性。