如何自定义“数据链接属性”对话框中的“连接”选项卡?
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>
之前让我发现QueryInterface
对IPersistPropertyBag
的调用失败。
【问题讨论】:
【参考方案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 自定义选项卡