Запуск Shell Links (LNK) из WOW64 - PullRequest
3 голосов
/ 22 декабря 2008

Наше 32-разрядное приложение запускает файлы Windows LNK (Shell Links) через ShellExecute. Когда он пытается «запустить» ссылку на 64-разрядный двоичный файл (например, ярлык «Internet Explorer (64-разрядный)» в меню «Пуск»), он всегда завершает запуск 32-разрядного двоичного файла. Внутренне, ShellExecute неправильно разрешает цель ссылки: внутри LNK есть скрытое поле, в котором хранится FOLDERID_ProgramFiles. 64-разрядное приложение разрешает это в каталоге 64-разрядных программных файлов, а 32-разрядное приложение - нет.

Wow64DisableWow64FsRedirection не изменяет это поведение ShellExecute.

Помимо прохождения 64-битного процесса «батута» (который не подходит из-за того, как работает наша архитектура плагинов), есть ли способ для 32-битного приложения запускать ссылки оболочки точно так же, как 64-битная приложение будет?

Ответы [ 4 ]

1 голос
/ 02 сентября 2010

Эндрю: Я дал ему шанс, и папка sysnative не делает ничего, что Wow64DisableWow64FsRedirection еще не делает. Проблема в том, что ShellExecute ошибочно полагает, что ссылка указывает на% programfiles (x86)%, тогда как фактически указывает на% programfiles% (даже если такого файла нет в% programfiles (x86)%).

Открытие 64-битных программ уже работает отлично. Проблема в файлах .lnk, указывающих на каталог% programfiles%.

0 голосов
/ 15 апреля 2009

Вы можете запустить процесс explorer.exe, который вызывает LNK.

Есть ли конкретная причина, по которой вы не можете скомпилировать вашу программу как 64-битное приложение?

0 голосов
/ 22 декабря 2009

Каждый раз, когда вы что-то здесь делаете на компьютере, подумайте еще раз ... Ключ в том, чтобы использовать путь c: \ windows \ sysnative \ path для отключения перенаправления.

Вот очень простой код, который будет делать то, что вы хотите:

#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;
}

Надеюсь, это полезно.

0 голосов
/ 23 декабря 2008

Чтение эта статья от Рэймонда Чена Я не думаю, что то, что вы спрашиваете, возможно. Я бы все еще подумал о создании небольшого «батутного» приложения, единственной задачей которого было запустить данное приложение / ссылку и скомпилировать другое для использования в 32-битных и 64-битных системах. Либо так, либо создайте две версии вашего приложения, 32-битную и 64-битную.

...