Delphi Win7上的TImageList读取错误(ComCtl32问题?)-如何/为什么会发生?

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 (对于那些不知道的人,请快速注意-

我需要关于如何追踪/解决此问题的想法:

我有一位潜在客户表示,在Windows 7 32位上,我的软件出现以下错误:

imagelist无法从流中读取imagelist数据

此人提供了以下附加信息:

  • 程序在启用Areo主题的情况下工作
  • 程序在经典主题上抛出错误
  • 安装了IE11
  • 个人报告在system32文件夹中同时具有5.82.7601.18837 comctl32.dll和在winsxs文件夹中具有6.10.7601.23039 comctl32.dll
(对于那些不知道的人,请快速注意-自WinXP以来,两个版本都作为默认版本提供)

该可执行文件是在主题化的Windows10上使用XE4构建的,至少可以在(自己测试的)上运行

  • win10/32位
  • win10/64位
  • WinXP/32位/经典主题
  • HyperV-Virtual-Win7-SP1/32位/经典主题/16位颜色
My TImagelist设置为“cdDeviceDependent”(对应于ILC_COLORDDB)

这是使用资源管理器从可执行文件中提取的清单:

<?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为目标,才能拥有视觉样式(运行时主题)。