【问题标题】:WOW64 woes (.lnk shortcuts)WOW64 问题(.lnk 快捷方式)
【发布时间】:2010-06-27 21:40:37
【问题描述】:

我使用的是 Windows 7 (x64) 和 Delphi 2010。

我正在编写一个模拟开始菜单的组件。但是,我遇到了以下问题:

  1. 如果我尝试使用ShellExecute 打开快捷方式(.lnk 文件),只要 %ProgramFiles% 是快捷方式的目标路径的一部分(然后它会查看C:\Program Files (x86) 文件夹而不是 C:\Program Files);
  2. 如果 %ProgramFiles% 是图标文件路径的一部分(与上述问题相同),ShGetFileInfo 无法在系统图像列表中提取图标的正确索引。

上述问题是否有任何解决方法,或者我是否必须等待本机 64 位 Delphi 可用才能正常工作?

【问题讨论】:

    标签: windows delphi shortcut shellexecute wow64


    【解决方案1】:

    我认为您应该先致电Wow64DisableWow64FsRedirection,然后致电Wow64RevertWow64FsRedirection

    【讨论】:

    • 好吧,这很烦人。虽然 Wow64DisableWow64FsRedirection 不能解决我最初的问题,但只要 %windir% 用作路径名的一部分,它就可以解决问题。人们会期望这会调整/重定向所有环境变量!
    • 我认为这行不通。所做的只是禁用重定向,以便从 Wow64 程序对 c:\windows\system32(例如)的访问不会被重定向到 c:\windows\syswow64。据我所知,这对环境变量没有任何帮助。您要么必须编译为本机 64 位,要么自己处理环境变量。
    • 好的,SetEnvironmentVariable('ProgramFiles', 'C:\Program Files') 解决了 ShGetFileInfo 的问题,但 ShellExecute 的问题仍然存在。
    【解决方案2】:

    好的,一个演示问题的小例子。

    我使用以下参数调用 ShellExecute:

    ShellExecute(Handle, 'open', 'C:\Users\...\Internet Explorer (64-bit).lnk', nil, nil, SW_SHOWNORMAL);
    

    Internet Explorer (64-bit).lnk 的目标是:

    C:\Program Files\Internet Explorer\iexplore.exe
    

    但是,iexplore.exe 的 32 位版本仍然打开。在这种情况下,路径甚至不使用 %ProgramFiles%,因此 ShellExecute 会以某种方式将 C:\Program Files 转换为 C:\Program Files ( x86) 内部。我不知道如何让它打开 64 位版本的 iexplore.exe

    另一个问题,调用Wow64DisableWow64FsRedirection后,ShellExecute将不再打开文件夹。

    【讨论】:

    • 不是问题的答案。请改为在问题中添加其他详细信息。
    • 对不起,我是新注册的,当我将 openid 添加到我的帐户时,我丢失了发布问题时使用的身份...
    • 更多关于这个问题的信息可以在这里找到:stackoverflow.com/questions/386715/…
    【解决方案3】:

    以下环境变量在 64 位机器上将始终指向正确的方向,而在 32 位机器上将未定义:

    来自 32 位架构上的 32 位 shell:

    C:\>echo %processor_architecture%
    x86
    C:\>echo %programfiles(x86)%
    %programfiles(x86)%
    C:\>echo %programw6432%
    %programw6432%
    C:\>echo %programfiles%
    C:\Program Files
    

    从 64 位架构上的 32 位 shell:

    C:\>echo %processor_architecture%
    x86
    C:\>echo %programfiles(x86)%
    C:\Program Files (x86)
    C:\>echo %programw6432%
    C:\Program Files
    C:\>echo %programfiles%
    C:\Program Files (x86)
    

    来自 64 位外壳:

    C:\>echo %processor_architecture%
    AMD64
    C:\>echo %programfiles(x86)%
    C:\Program Files (x86)
    C:\>echo %programw6432%
    C:\Program Files
    C:\>echo %programfiles%
    C:\Program Files
    

    在运行应用程序之前尝试替换它们。

    【讨论】:

      猜你喜欢
      • 2012-05-07
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2017-04-25
      相关资源
      最近更新 更多