2011-10-12 38 views
5

这是我最近发现的最有趣的问题之一。 我们有一个传统的Delphi 5程序(Rave Reports 4参考文件阻止升级到D2007)。当清单被添加为资源时,Delphi 5会导致EAccessViolation

当程序与我们的模板生成版本资源编译时,它工作正常。当模板生成的清单资源添加到程序的dpr中时也会出现问题。

清单是一个 “通用”,ASCII文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 

    <assemblyIdentity 
    name="Name" 
    processorArchitecture="x86" 
    version="2.0.0.0" 
    type="win32"/> 

    <description>Desc</description> 

    <dependency> 
     <dependentAssembly> 
      <assemblyIdentity 
       type="win32" 
       name="Microsoft.Windows.Common-Controls" 
       version="6.0.0.0" 
       processorArchitecture="x86" 
       publicKeyToken="6595b64144ccf1df" 
       language="*" 
      /> 
     </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="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
     <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> 
    </application> 
    </compatibility> 

</assembly> 

在App.dpr有一个明显的资源引用:

{$R 'manifest.res' 'manifest.rc'} 

货单编译调用:

C:\Program Files\Borland\Delphi5\Bin\brcc32.exe manifest.rc 

当程序启动后,异常提出:

对于主线程
exception class : EAccessViolation 
exception message : Access violation at address 75A1A890 in module 'KERNELBASE.dll'. Read of address 00000001. 

调用堆栈:

main thread ($1144): 
75a1a890 +007 KERNELBASE.dll 
75a1a97c +069 KERNELBASE.dll   WideCharToMultiByte 
73f28764 +048 comctl32.dll   #342 
777741f4 +016 user32.dll    CallWindowProcA 
00092de2 +0ca app.exe  Controls TWinControl.DefaultHandler 
0009336c +01c app.exe  Controls TWinControl.WMNotify 
000c2454 +024 app.exe  ComCtrls TCustomListView.WMNotify 
00090249 +111 app.exe  Controls TControl.WndProc 
00092d0a +1d2 app.exe  Controls TWinControl.WndProc 
000c39ea +072 app.exe  ComCtrls TCustomListView.WndProc 
0009290c +02c app.exe  Controls TWinControl.MainWndProc 
000a5880 +014 app.exe  Forms StdWndProc 
77757690 +044 user32.dll    SendMessageW 
777741f4 +016 user32.dll    CallWindowProcA 
000c1e6f +0c7 app.exe  ComCtrls TCustomListView.HeaderWndProc 
000a5880 +014 app.exe  Forms StdWndProc 
7763642b +02b ntdll.dll    KiUserCallbackDispatcher 
77753573 +00a user32.dll    DispatchMessageA 
000ae8c7 +083 app.exe  Forms TApplication.ProcessMessage 
000ae8fe +00a app.exe  Forms TApplication.HandleMessage 
000aeb09 +081 app.exe  Forms TApplication.Run 
00186ecf +077 app.exe  mca  initialization 
75b61192 +010 kernel32.dll   BaseThreadInitThunk 

链接COMCTL32.DLL:

73f00000 comctl32.dll   6.10.7600.16385 C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7600.16385_none_421189da2b7fabfc 

从我所看到的问题,势必有一些德尔福5个不兼容性COMCTL32.DLL控制。我更新了Delphi VCL到最新版本。除了迁移到D2007之外,还有其他解决方案吗?

+1

迁移到Delphi 2007是个不错的主意。那么你只有4年过时而不是12年。 –

+0

对于现成的软件,我完全同意。然而,这是一次“定制”的旧定制应用程序“刷新”,工作得到相应补偿。只要不涉及Rave,Delphi 2007的升级是无懈可击的。德尔福2009年不一定如此(我正在谈论dailywtf合格代码)。 – too

回答

5

如果我正确记得,你需要更多的只是清单。您还需要Mike Lischke's theme manager component。这段代码最终在Delphi 7中找到了方法。

+0

是的,就是这样。作为副作用,应用程序现在看起来更好 - 谢谢。 – too

+1

只需添加一点这个答案,如果你有一个没有主题(由于DC政治)的Windows 7(或2008服务器),至少在64位版本上,你也会得到这个错误...唯一的我发现的答案是完全删除主题。 – Chiguireitor

相关问题