Delphi Win7上的TImageList读取错误(ComCtl32问题?)-如何/为什么会发生?
我需要关于如何追踪/解决此问题的想法: 我有一位潜在客户表示,在Windows 7 32位上,我的软件出现以下错误: imagelist无法从流中读取imagelist数据 此人提供了以下附加信息:Delphi Win7上的TImageList读取错误(ComCtl32问题?)-如何/为什么会发生?,delphi,winapi,imagelist,comctl32,Delphi,Winapi,Imagelist,Comctl32,我需要关于如何追踪/解决此问题的想法: 我有一位潜在客户表示,在Windows 7 32位上,我的软件出现以下错误: imagelist无法从流中读取imagelist数据 此人提供了以下附加信息: 程序在启用Areo主题的情况下工作 程序在经典主题上抛出错误 安装了IE11 个人报告在system32文件夹中同时具有5.82.7601.18837 comctl32.dll和在winsxs文件夹中具有6.10.7601.23039 comctl32.dll (对于那些不知道的人,请快速注意-
- 程序在启用Areo主题的情况下工作
- 程序在经典主题上抛出错误
- 安装了IE11
- 个人报告在system32文件夹中同时具有5.82.7601.18837 comctl32.dll和在winsxs文件夹中具有6.10.7601.23039 comctl32.dll
- win10/32位
- win10/64位
- WinXP/32位/经典主题
- HyperV-Virtual-Win7-SP1/32位/经典主题/16位颜色
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"
/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
</assembly>
待办事项
我在文档中注意到,ImageList_WriteEx的状态是:
“您不应该创建使用ILC_COLOR32的ILP_DOWNLEVEL标志写入的图像列表”
我不确定在32位颜色系统上使用“ILC_COLORDDB”作为值进行编译时会发生什么情况
我的想法是,ILP_下层可能会被忽略。。。因此,当被5.x ComCtl32读取时,更可能失败?但是我在网上找不到任何这样的案例,但是
另外,我的可执行文件似乎可以在虚拟的Win7-SP1-32bit-16color-classic-themes配置上运行
待办事项
发送调试工具以获取/确认comctl32.dll上加载的实际版本
尝试过
我曾尝试将用户指向一个旧版本,该版本的清单中没有**compability部分。这没有任何区别。默认情况下,Windows7上的ComCtl32版本是5.82,而不是6.x 因此,您必须根据需要修改清单,以允许使用与Windows 7兼容的Comctl32版本
当然,如果您的应用程序没有使用ComCtl32版本5.82中不存在的某些功能,那么这是正常的。如果是这样的话,您将不得不对其进行一些改进,或者干脆将Windows 7从您的应用程序的官方支持平台上删除。您能检查一下ComCtl32.dll的V6是否真的在Win 7系统上可用吗?从某个地方开始。发送一个可执行文件,其清单和图像列表与检索版本的清单和图像列表相同(
@GetDllVersion:=GetProcAddress(LoadLibrary(comctl32),'DllGetVersion'
)。@SilverWarior您确定在WinSxS中没有它吗?V6已经是WindowsXP香草发行版的一部分…(但您可以在WinSxS文件夹中找到它)我的理解是,Delphi应用程序应该仍然可以正常工作,因为如果应用程序在清单中请求V6,而它不在清单中,那么将使用V5。但是图像流非常不幸运……但是必须有其他Delphi开发人员遇到这种情况。@SertacAkyuz说了什么。您需要检查comctl32 DLL版本。我很可能Delphi IDE以较新的sream格式保存了列表,客户端无法使用较旧的ComCtl32版本读取该列表。旁注:我从不信任DFM流式处理图像列表,因此我保留位图本身(而不是流式格式)作为单独DLL或“我的前任”中的一个资源,并在运行时通过imagelist\u LoadImage
将其加载到imagelist中。为什么您/我们还不知道在客户站点加载可执行文件的确切版本是什么?您必须阅读链接的表,只需在下面两行。Windows 7附带了5.82和6.10。@SertacAkyuz it可能某些windows update附带了较新的ComCtl32文件,但默认情况下使用的是ComCtl32版本5.82。事实上,当我在windows 7计算机上检查ComCtl32版本时,我只有版本5.82。当然,我没有完全更新我的计算机,因为我不时手动安装windows update,而不是离开automat已启用ic更新。因此,我的答案完全有效,因此不知道为什么会将其标记为删除。此外,为了获得最佳兼容性,您应该尽可能将ComCtl32的最低例外版本作为目标。您可以在WinSxS文件夹中找到V6。V6甚至与普通Windows XP一起提供(是什么使主题在Windows XP中工作)请参阅:不,链接是准确的,您的答案是错误的。除此之外,您的评论也没有意义。您必须以版本6为目标,才能拥有视觉样式(运行时主题)。