【发布时间】:2011-07-05 04:44:31
【问题描述】:
多年来,Delphi 一直支持应用程序设置选项卡上的启用运行时主题开关。但是,这仅适用于可执行文件。假定 DLL 会从其父应用程序中接管主题(和其他)设置。
不幸的是,Microsoft Office 在那里表现不佳。它们的“主题”外观是使用自定义控件实现的,而不是通过 Windows 自己的通用控件。
在 MSDN 文章 830033 - How to apply Windows XP themes to Office COM add-ins Microsoft 中解释了如何将清单应用到 DLL,使其隔离感知,从而忽略来自父进程的设置。
基本上,它归结为两个步骤:
- 在您的进程中包含默认清单资源,使用 int-resource id 2(与您通常使用的 1 相反)。
- 使用 ISOLATION_AWARE_ENABLED 定义进行编译。 **这在 Delphi 中不可用。**
我认为我已经确定了 (1),尽管我不太确定 brcc32 是否将资源 ID 作为整数或文字字符串来获取。真正的问题在于(2)。据说,这个定义改变了几个 DLL 函数绑定。
有人在 Delphi 中解决过这个问题吗?我应该进一步调查这条路线,我应该尝试手动创建激活上下文,还是有其他优雅的解决方案来解决这个问题?
【问题讨论】:
-
我不知道任何优雅的解决方案。快速浏览 WinSDK 标头显示 ActivateActCtx 和 DeactivateActCtx 似乎很重要 - 它们在加载 CommCtrl API 函数时包装了对 LoadLibrary 和 GetProcAddress 的调用。 WinSDK 标头包含所有代码 AFAICS,但需要进行一些反混淆,因为它们似乎已被重命名以避免冲突(例如 IsolationAwarePrivatezltRgCebPnQQeRff、CommctrlIsolationAwarePrivatetRgCebPnQQeRff_pbZPgYQP_QYY 等)
-
@Barry:感谢您的探索!我是否正确假设 Delphi RTL/VCL 没有对激活上下文做任何事情,并且完全依赖于生成的清单?
-
我没有任何特别的知识,我只是查看了 SDK 标头以帮助提供线索。
标签: delphi dll ms-office theming