问题
Our 32-Bit application launches Windows LNK files (Shell Links) via ShellExecute. When it tries to "launch" a link to a 64-Bit binary (such as the "Internet Explorer (64-Bit)" shortcut in Start Menu) it always ends up launching the 32-Bit binary. Internally, ShellExecute incorrectly resolves the link target: There's a hidden field inside the LNK which holds FOLDERID_ProgramFiles. A 64-Bit app resolves this to the 64-Bit Program Files directory, but a 32-Bit app won't.
Wow64DisableWow64FsRedirection does not change this behavior of ShellExecute.
Besides going through a 64-Bit "trampoline" process (which is not an option due to how our plugin architecture works), Is there any way for a 32-Bit app to launch shell links exactly the way a 64-Bit app would?
回答1:
Andrew: I gave it a shot, and the sysnative folder does not do anything that Wow64DisableWow64FsRedirection doesn't already do. The problem is that ShellExecute mistakenly assumes that the link is pointing to %programfiles(x86)%, when it is in fact pointing to %programfiles% (Even when there is no such file in %programfiles(x86)%).
Opening 64bit programs already works perfectly fine. It's .lnk files pointing to the %programfiles% directory that are the problem.
回答2:
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.
回答3:
You could spawn an explorer.exe process which calls on the LNK.
Is there a particular reason you can't compile your program as a 64bit application?
回答4:
Anytime you here something is impossible on a computer, think again... The key is to utilize the c:\windows\sysnative\ path to shut off the redirection.
Here is very simple code that will do what you want:
#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;
}
I hope that is helpful.
来源:https://stackoverflow.com/questions/386715/launching-shell-links-lnks-from-wow64