如何在"数据链接属性"对话框中自定义"连接"选项卡?
How to customize the Connection tab in the Data Link Properties dialog?
我正在开发一个OLEDB提供程序,该提供程序现在利用IDBPromptInitialize::PromptDataSource()
提供的"默认"连接对话框,如下所示。当我将我的提供程序与某些客户端工具(如 MS Excel 或 .udl 文件(一起使用时,会出现相同的 UI。我现在计划创建自己的 UI。
选项卡中选择不同的OLEDB提供程序时,我注意到对于其中一些"连接"选项卡看起来完全不同,例如.SQL服务器本机客户端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
。
下面描述了这一点: 提供程序实现的接口
实现IIDBInitialize
/IDBProperties
的OLEDB提供程序的对象也必须实现IServiceProvider
。
系统将使用OLEDB_SVC_DSLPropertyPages
(来自 MSDAGUID(调用此IServiceProvider
实现。H( 作为服务 GUID,ISpecifyPropertyPages 作为接口 ID。
ISpecifyPropertyPages::GetPages Fills a counted GUID 值数组,其中每个 GUID 指定每个 GUID 的 CLSID 可在此属性表中显示的属性页 对象。GetPages 由数据链接核心组件调用,以获取 表示可扩展属性的两个 CLSID 的数组 页面:第一个用于替换"连接"选项卡,第二个用于替换">连接"选项卡 替换">高级"选项卡。这些页面必须正确注册,以便 它们可以由进程中的数据链路核心组件共同创建。
这些属性页是标准的 Windows 属性页。
- 当套接字连接断开时检测C/C++Unix
- 无法在windows上使用mingw将sqlite3与c连接
- 到连接组件算法的问题(递归)
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 无法在C++中建立与MySQL数据库的连接
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 使用 bfs 解决连接组件问题时得到错误的答案
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- OSX蓝牙打开RFCOMMChannelAsync声称已连接,但未建立连接,并且从未调用过委托
- 在 libcurl 连接池中预创建连接
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- libcurl 和 DNS ttl 中的内部连接管理
- 如何应用 libcurl 的持久连接选项
- 提升 ASIO - io_service 不要等待连接到线程
- WinSock2:connect() 提供"连接被拒绝"
- 升压信号2将插槽传递到成员功能以断开连接