Как я могу перенаправить все ярлыки на данный исполняемый файл? Есть ли какой-нибудь эквивалент символической ссылки в Windows? - PullRequest
1 голос
/ 10 октября 2009

Я работаю над программой, которая включает в себя механизм общего назначения, некоторый контент для конкретной программы и настраиваемое автоматическое средство обновления, позволяющее максимально эффективно обновлять мультимедийные данные в нашем контенте. В недавнем выпуске движка мы реорганизовали нашу структуру каталогов, так что вместо установки исполняемого файла (например,) c:\Program Files\Program\Engine.exe теперь она находится в c:\Program Files\Program\engine\win32\NewEngine.exe (обратите внимание, что имя движка также изменилось в этот процесс).

Проблема в том, что для запуска программы пользователю необходимо использовать ярлык, который мы устанавливаем в его меню «Пуск» и (необязательно) на рабочем столе. Однако движение двигателя после обновления ломает эти ярлыки. Так что теперь мне нужно найти способ исправить все ярлыки, которые есть у пользователя для запуска программы.

Исходя из фона Unix / Mac OS X, я хотел бы просто создать символическую ссылку из старого исполняемого имени на новое. Насколько я знаю, на самом деле в Windows нет эквивалента символической ссылки (из Googling я вижу, что в Vista и более поздних есть символические ссылки, но это должно работать в XP). Я ошибаюсь в своем предположении? Есть ли в Windows эквивалент символической ссылки на исполняемый файл?

Некоторые другие возможные решения, которые приходят на ум:

  1. Создание небольшого исполняемого файла в старом месте, который запускает реальный в новом месте. Есть ли какой-нибудь быстрый и простой способ создать простой исполняемый файл без головы, который просто запускает другую программу? Опять же, в Unix я просто создал бы сценарий оболочки, но насколько я знаю, я могу ' Назовите .bat file .exe и запустите его, так что это должен быть способ для генерации .exe.
  2. После обновления найдите все ярлыки, которые указывают на исполняемый файл, и отредактируйте их. Существует ли какой-либо (эффективный и надежный) способ найти все ярлыки в системе, которые указывают на указанное местоположение, и обновить их?
  3. Комбинация вышеперечисленного с небольшим исполняемым файлом, который определяет, что он запускается из ярлыка, и редактирует этот ярлык перед запуском реальной программы. Есть ли способ обнаружить, что программа запускается из ярлыка, и, таким образом, иметь возможность редактировать этот ярлык?

Будет ли работать любой из этих параметров, и если да, то как? Каков наилучший способ сделать это в Windows? Не хватает ли других способов перенаправления ярлыка из одного места в другое?

изменить, чтобы добавить : Некоторые дополнительные требования, которые у нас есть:

  1. Многие из наших пользователей нетехнические. О любом решении, требующем вмешательства пользователя, не может быть и речи.
  2. Это должно быть как можно более плавным. Любые дополнительные окна, появляющиеся каждый раз, когда пользователь нажимает на ярлык, недопустимы.
  3. Это должно быть надежно перед лицом большинства действий, которые мог бы сделать пользователь, таких как перестановка меню «Пуск» или перемещение ярлыка на панель быстрого запуска.
  4. Наши ярлыки абсолютно необходимы для функционирования программы, так как они передают аргументы, необходимые движку для загрузки контента (да, это не идеально, я бы предпочел это исправить, но не могу на этом этапе)
  5. Я ищу что-то относительно быстрое, простое в реализации и чрезвычайно надежное.

Ответы [ 6 ]

3 голосов
/ 13 января 2010
1 голос
/ 19 октября 2009

Из документации MSDN для ShellExecute () я заметил, что вам может потребоваться инициализация COM. Также вам необходимо указать полный путь к исполняемому файлу (не относительный). В качестве альтернативы вы можете использовать переменные ENVIRONMENT в ярлыках вместо полных путей. Вы можете изменить переменные ENVIRONMENT во время новых установок, чтобы они отражали новые пути.

1 голос
/ 13 октября 2009

Ну, решение, которое мы выбрали, это просто маленький исполняемый файл, который запускает наш настоящий движок. Visual Studio потребовалось немного больше усилий, чтобы настроить проект, чем я бы предпочел, но, похоже, все получилось.

#include "stdafx.h"
#include <shellapi.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
  HINSTANCE result = ShellExecute(NULL, _T("open"), 
                                  _T("engine\\win32\\NewEngine.exe"),
                                  lpCmdLine, NULL, 1);
  // ... handle errors ...
  return 0;
}

редактировать : Нет. Кажется, это работает на XP, но не на Windows 7 или Vista. Любые идеи о том, почему это не сработает в Windows 7 или Vista, будут высоко оценены. Если я не смогу это выяснить в ближайшее время, я могу разбить это на отдельный вопрос.

редактировать 2 : Ах. На XP косые черты в путевом имени работают просто отлично. В Vista или новее вам необходимо использовать обратную косую черту.

1 голос
/ 10 октября 2009

Почему вы не можете перезаписать ярлыки во время установки обновлений?

Вы должны перезаписывать только ярлыки по умолчанию, а не каждый ярлык , который мог создать пользователь. Тем не менее, для этого второго случая вы можете использовать вариант 1, но да, это должен быть настоящий исполняемый файл.

(Я думаю, вы можете с уверенностью предположить, что если пользователь создал третий ярлык в нестандартном месте, он знает, что это значит или где искать информацию, когда скопированный ярлык не работает. поместите предупреждение где-нибудь в программе обновления, отмечая изменения.)

Если вы действительно хотите сделать то, что заявили (обновляя каждый ярлык), вы можете сделать это с расширением метода принятого ответа здесь . Просто найдите для любого файла .lnk, посмотрите, является ли TargetPath старым расположением движка, и обновите его, если оно есть.

0 голосов
/ 14 октября 2009

Вместо ShellExecute, попробуйте CreateProcess или порождать эквиваленты. Я бы сделал ставку на CreateProcess.

0 голосов
/ 11 октября 2009

Это звучит как проблема с установщиком для меня. Во время обновления, почему бы просто не удалить старую версию и установить новую версию? Я не знаком с Inno Setup, но именно так мы делаем наш установщик InstallShield для обновления. Конечно, это не относится к случаю, когда пользователь вручную создает ярлык; однако пользователь может просто воссоздать его. Что касается простого поиска и замены, я не думаю, что оно того стоит.

...