3

我们的 32 位应用程序通过 ShellExecute 启动 Windows LNK 文件(Shell 链接)。当它尝试“启动”指向 64 位二进制文​​件的链接(例如“开始”菜单中的“Internet Explorer(64 位)”快捷方式)时,它总是最终启动 32 位二进制文​​件。在内部,ShellExecute 错误地解析了链接目标:LNK 内部有一个隐藏字段,其中包含 FOLDERID_ProgramFiles。64 位应用程序将此解析为 64 位程序文件目录,但 32 位应用程序不会。

Wow64DisableWow64FsRedirection 不会改变 ShellExecute 的这种行为。

除了通过 64 位“蹦床”过程(由于我们的插件架构如何工作,这不是一个选项),32 位应用程序是否有任何方法可以像 64 位应用程序一样启动 shell 链接?

4

4 回答 4

1

Andrew:我试了一下,sysnative 文件夹没有做任何 Wow64DisableWow64FsRedirection 还没有做的事情。问题是 ShellExecute 错误地假定链接指向 %programfiles(x86)%,而实际上它指向 %programfiles%(即使 %programfiles(x86)% 中没有这样的文件)。

打开 64 位程序已经可以正常工作了。问题是指向 %programfiles% 目录的 .lnk 文件。

于 2010-09-02T01:44:24.680 回答
0

Reading this article from Raymond Chen I don't think what you're asking is possible. I would still consider making a small "trampoline" application, who's only job was to launch the given application/link, and compiling a different one for use on 32bit and 64bit systems. Either that or build two versions of your application, a 32bit and 64bit one.

于 2008-12-23T16:18:40.030 回答
0

您可以生成一个调用 LNK 的 explorer.exe 进程。

您不能将程序编译为 64 位应用程序是否有特殊原因?

于 2009-04-15T00:07:05.517 回答
0

任何时候你在这里的东西是不可能在计算机上,再想一想......关键是利用 c:\windows\sysnative\ 路径来关闭重定向。

这是非常简单的代码,可以满足您的要求:

#include <windows.h>
#include <ShellAPI.h>
#include <stdio.h>

int main(int iArgc, const char *pArgv[])
{
    ShellExecute(NULL, L"open", L"C:\\windows\\sysnative\\..\\..\\Program Files\\Internet Explorer\\iexplore.exe", NULL, NULL, SW_SHOWNORMAL);
    BOOL bIAmWow64 = FALSE;
    IsWow64Process(GetCurrentProcess(), &bIAmWow64);
    printf("I am a wow64 process: %hs\n", bIAmWow64 ? "Yes": "No");
    return 0;
}

我希望这会有所帮助。

于 2009-12-22T20:56:45.487 回答