65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2001年10月9日

1分钟阅读

viewsIcon

56979

downloadIcon

424

使用 OLE DB 通用对话框扩展现有的属性浏览器

Sample Image - oledbdialog.jpg

引言

我曾经有一个项目,需要轻松地存储和检索属性。我发现康斯坦丁·布克列夫 (Konstantin Boukreev) 的文章 “使用 OLE 自动化设置属性” 对此非常有帮助。他编写了一个 ActiveX 控件,它允许通过 IDispatch 接口在 VB IDE 属性浏览器中操作属性。

工作原理

因此,我决定为程序创建一个 COM 对象来操作属性,并通过之前描述的 ActiveX 控件对其进行编辑。首先需要提及的是我的属性 COM 对象中的以下宏

DECLARE_CLASSFACTORY_SINGLETON (CObserverDS)

这样做是为了使我的属性 COM 对象在每个进程中都是唯一的。我遇到的下一个问题是,我的属性中有一个连接字符串。将它作为字符串进行编辑不是一个好的风格。例如,如果您使用 OLE DB 或 ADO,您会知道用于选择数据链接属性的常用对话框。

ole db providers - img1.jpg

抱歉有俄文说明 :) 找不到非俄文操作系统。

幸运的是,康斯坦丁·布克列夫 (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 示例

vb sample - img2.jpg

仅用于编辑我的 COM 对象的 connectionString 属性。

connection string - img3.jpg

© . All rights reserved.