如何在“数据链接属性”对话框中自定义“连接”选项卡?

时间:2017-07-12 12:45:06

标签: c++ user-interface com oledb atl

我正在开发OLEDB提供商,现在利用"默认" IDBPromptInitialize::PromptDataSource()提供的连接对话框,类似于this。当我将提供程序与某些客户端工具(如MS Excel或.udl文件)一起使用时,会出现相同的UI。我现在正计划创建自己的UI。

在“提供程序”选项卡中选择不同的OLEDB提供程序时,我注意到对于其中一些提供程序,“连接”选项卡看起来非常不同,例如SQL Server Native Client 11.0

因此,定制它似乎在技术上是可行的。我的问题是:如何?

注意:我知道我可以将我自己的UI放在一起,并且我可以随时弹出它。但这不会神奇地集成到“数据链接属性”对话框的“连接”选项卡中,是吗?

谢谢!

修改

显然,我接受了答案。我执行了所描述的所有步骤。当我在我自己的测试应用程序中使用我的提供程序创建一个属性表时,一切都很有效[美妙] [3]。我的测试版应用程序在我的提供程序上调用ISpecifyPropertyPages::GetPages,并将结果传递给OleCreatePropertyFrame,如答案中所述。

但是,当我在“数据链接”对话框中使用它时,只要选择我的提供程序并单击“下一步”按钮或其中一个选项卡,选项卡就会消失。仅保留“提供者”选项卡 调试它我可以看到GetPages被成功调用,但只有我的ConnectionTab的构造函数被调用(没有任何错误),然后标签消失(没有崩溃!)。没有调用IPropertyPage方法或其他任何方法。 任何想法可能是什么问题?

编辑 - 已解决

好的,我已经知道了。在我的AdvancedTab类中,我错过了COM Map中的COM_INTERFACE_ENTRY(IPersistPropertyBag)。我过于关注“连接”选项卡,因为我希望首先使用它。

如果有人有兴趣: 在#define _ATL_DEBUG_QI之前设置#include <atlcom.h>会让我发现QueryInterface的{​​{1}}调用失败。

1 个答案:

答案 0 :(得分:0)

这里描述:Interfaces Implemented by the Provider

实现IIDBInitialize / IDBProperties的OLEDB提供程序的对象也必须实现IServiceProvider

系统将调用此IServiceProvider实现,其中OLEDB_SVC_DSLPropertyPages(来自MSDAGUID.H)作为服务guid,ISpecifyPropertyPages作为接口ID。

  

ISpecifyPropertyPages :: GetPages填写计数   GUID值数组,其中每个GUID指定每个GUID值的CLSID   可以在属性表中显示的属性页   宾语。 GetPages由Data Link核心组件调用以获取   恰好两个表示可扩展属性的CLSID的数组   页面:第一个替换连接标签,第二个替换   替换高级标签。这些页面必须正确注册   它们可以由进程中的Data Link核心组件共同处理。

这些属性页是标准Windows property pages