4

我正在使用 Windows 7 (x64) 和 Delphi 2010。

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

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

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

4

3 回答 3

2

我认为你应该Wow64DisableWow64FsRedirection在之前和Wow64RevertWow64FsRedirection之后打电话。

于 2010-06-26T18:28:38.657 回答
1

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

我使用以下参数调用 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

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

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

于 2010-06-27T13:08:10.707 回答
1

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

从 32 位架构上的 32 位外壳:

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

从 64 位架构上的 32 位外壳:

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

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

于 2010-06-27T13:40:37.940 回答