3

32ビットアプリケーションは、ShellExecuteを介してWindows LNKファイル(シェルリンク)を起動します。64ビットバイナリ([スタート]メニューの[Internet Explorer(64ビット)]ショートカットなど)へのリンクを「起動」しようとすると、常に32ビットバイナリが起動することになります。内部的に、ShellExecuteはリンクターゲットを誤って解決します。LNK内にFOLDERID_ProgramFilesを保持する隠しフィールドがあります。64ビットアプリはこれを64ビットプログラムファイルディレクトリに解決しますが、32ビットアプリは解決しません。

Wow64DisableWow64FsRedirectionは、ShellExecuteのこの動作を変更しません。

64ビットの「トランポリン」プロセス(プラグインアーキテクチャの仕組みによりオプションではありません)を実行する以外に、32ビットアプリが64ビットアプリとまったく同じようにシェルリンクを起動する方法はありますか?

4

4 に答える 4

1

Andrew: やってみましたが、sysnative フォルダーは、Wow64DisableWow64FsRedirection がまだ行っていないことを何もしません。問題は、リンクが実際には %programfiles% を指しているのに (%programfiles(x86)% にそのようなファイルがない場合でも)、ShellExecute が誤ってリンクが %programfiles(x86)% を指していると想定することです。

64ビットプログラムを開くことは、すでに完全に正常に機能しています。問題となっているのは、%programfiles% ディレクトリを指している .lnk ファイルです。

于 2010-09-02T01:44:24.680 に答える
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 に答える
0

Raymond Chen のこの記事を読んでも、あなたが求めていることは不可能だと思います。特定のアプリケーション/リンクを起動するだけの小さな「トランポリン」アプリケーションを作成し、32ビットおよび64ビットシステムで使用するために別のアプリケーションをコンパイルすることを引き続き検討します。それか、アプリケーションの 2 つのバージョン (32 ビットと 64 ビット) をビルドします。

于 2008-12-23T16:18:40.030 に答える
0

LNK を呼び出す explorer.exe プロセスを生成できます。

プログラムを 64 ビット アプリケーションとしてコンパイルできない特定の理由はありますか?

于 2009-04-15T00:07:05.517 に答える