Я пытаюсь программно найти exe-файл, который запускается для данного файла MSI lnk (рекламируемый ярлык). Я использовал подход, подобный тому, который показан в ответе Is there a way to resolve a .lnk target that works for links that end up in c:\windows\installer?. Этот подход отлично подходит для большинства файлов MSI lnk. К сожалению, существует небольшое количество файлов lnk, которые работают нормально, но MsiGetShortcutTarget не возвращает идентификатор компонента. Поэтому последующий вызов MsiGetComponentPath возвращает InvalidArg.MsiGetShortcutTarget Файлы MSI LNK не возвращают идентификатор компонента
Вот код, я использую (из here):
public const int MaxFeatureLength = 38;
public const int MaxGuidLength = 38;
public const int MaxPathLength = 1024;
public static string ParseShortcut(string shortcutFilename)
{
StringBuilder product = new StringBuilder(MaxGuidLength + 1);
StringBuilder feature = new StringBuilder(MaxFeatureLength + 1);
StringBuilder component = new StringBuilder(MaxGuidLength + 1);
var returnValue = MsiGetShortcutTarget(shortcutFilename, product, feature, component);
if (returnValue != 0)
{
return null;
}
int pathLength = MaxPathLength;
StringBuilder path = new StringBuilder(pathLength);
InstallState installState = MsiGetComponentPath(product.ToString(), component.ToString(), path, ref pathLength);
if (installState == InstallState.Local)
{
return path.ToString();
}
else
{
return null;
}
}
Пример на моей машине C: \ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ Microsoft Office 2013 \ Office 2013 Инструменты \ Office 2013 Язык Preferences.lnk
идентификатор продукта: {91150000-0011-0000-0000-0000000FF1CE} идентификатор функции: SetLanguageFiles
Я считаю, что интерфейс IShellLink не может быть использован, чтобы вернуть работоспособный е xe для объявленных ярлыков MSI, и мои попытки сделать это вернули путь к exe, содержащему ресурсы значков.
Очевидно, что операционная система может найти соответствующий exe (в данном случае это C: \ Program Files (x86) \ Microsoft Office \ Office15 \ SETLANG.EXE).
Как получить, какой exe-файл связан с этим файлом lnk с помощью кода?
Чтобы быть уверенным, это может помочь разместить ваш код. – PhilDW
Код добавлен, спасибо. – fractor
Глядя на [это] (http://www.symantec.com/connect/articles/working-darwin-descriptors) Я вижу, почему файл lnk не возвращает идентификатор компонента. Это потому, что в нем содержится только код продукта. Поэтому я догадываюсь, что вопрос сводится к: учитывая код продукта (и функцию), как мне получить (единственный) компонент id? – fractor