长期以来,Delphi 在应用程序设置选项卡中支持“启用运行时主题”开关。然而,这仅适用于可执行文件。DLL 假定从其父应用程序继承主题(和其他)设置。
不幸的是,Microsoft Office 在这方面表现不佳。他们的“主题”外观是通过使用自定义控件实现的,而不是通过 Windows 自己的公共控件实现的。
在 MSDN 文章 830033 - 如何将 Windows XP 主题应用于 Office COM 加载项 中,Microsoft 解释了如何向 DLL 应用清单,使其成为“隔离感知”,从而忽略来自父进程的设置。
基本上,它归结为两个步骤:
1. 在您的进程中包含默认清单资源,使用 int-resource id 2(而不是通常使用的 1)。 2. 使用 ISOLATION_AWARE_ENABLED 定义进行编译。 **这在 Delphi 中不可用。**
我认为我已经解决了(1),尽管我从来不确定 brcc32 是否将资源 ID 作为整数或作为文字字符串。真正的问题在于(2)。据说,此定义会更改多个 DLL 函数绑定。
有人在 Delphi 中解决了这个问题吗?我应该进一步研究这条路吗,还是应该尝试手动创建激活上下文,或者是否有其他优雅的解决方案来解决这个问题?
不幸的是,Microsoft Office 在这方面表现不佳。他们的“主题”外观是通过使用自定义控件实现的,而不是通过 Windows 自己的公共控件实现的。
在 MSDN 文章 830033 - 如何将 Windows XP 主题应用于 Office COM 加载项 中,Microsoft 解释了如何向 DLL 应用清单,使其成为“隔离感知”,从而忽略来自父进程的设置。
基本上,它归结为两个步骤:
1. 在您的进程中包含默认清单资源,使用 int-resource id 2(而不是通常使用的 1)。 2. 使用 ISOLATION_AWARE_ENABLED 定义进行编译。 **这在 Delphi 中不可用。**
我认为我已经解决了(1),尽管我从来不确定 brcc32 是否将资源 ID 作为整数或作为文字字符串。真正的问题在于(2)。据说,此定义会更改多个 DLL 函数绑定。
有人在 Delphi 中解决了这个问题吗?我应该进一步研究这条路吗,还是应该尝试手动创建激活上下文,或者是否有其他优雅的解决方案来解决这个问题?