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

Posted

技术标签:

【中文标题】如何自定义“数据链接属性”对话框中的“连接”选项卡?【英文标题】:How to customize the Connection tab in the Data Link Properties dialog? 【发布时间】:2017-12-16 21:43:05 【问题描述】:

我正在开发一个 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 映射中缺少 COM_INTERFACE_ENTRY(IPersistPropertyBag)。我过于关注“连接”选项卡,因为我想先让它发挥作用。

如果有人感兴趣: 将#define _ATL_DEBUG_QI 放在#include <atlcom.h> 之前让我发现QueryInterfaceIPersistPropertyBag 的调用失败。

【问题讨论】:

【参考方案1】:

这里有描述:Interfaces Implemented by the Provider

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

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

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

这些属性页是标准的 Windows property pages。

【讨论】:

我在实现这个时遇到了问题。当我编写自己的属性表应用程序时它工作正常,但它不适用于“数据链接”对话框。查看更新的问题。 @yira - 听起来像是代码中的错误。无法不复制代码。 你是对的!这是一个愚蠢的错误......缺少一个界面条目。谢谢!

以上是关于如何自定义“数据链接属性”对话框中的“连接”选项卡?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 应用程序的对话框中打开 Chrome 自定义选项卡

在 Chrome 自定义选项卡中从 WebView 打开链接时获取 ANR 对话框。我该如何调试?

Excel技巧:自定义选项卡

Word调出“开发工具”选项卡

如何删除WPS专业版的MathType选项卡?

自定义DialogFragment中的Tablayout不显示选项卡文本和图标