2016-01-06 5 views
3

Я пытаюсь программно найти 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 с помощью кода?

+0

Чтобы быть уверенным, это может помочь разместить ваш код. – PhilDW

+0

Код добавлен, спасибо. – fractor

+0

Глядя на [это] (http://www.symantec.com/connect/articles/working-darwin-descriptors) Я вижу, почему файл lnk не возвращает идентификатор компонента. Это потому, что в нем содержится только код продукта. Поэтому я догадываюсь, что вопрос сводится к: учитывая код продукта (и функцию), как мне получить (единственный) компонент id? – fractor

ответ

0

Когда идентификатор компонента не возвращается из MsiGetShortcutTarget, можно получить идентификатор компонента из базы данных MSI. Один из способов сделать это - использовать WiX DTF, как показано здесь: https://stackoverflow.com/a/34680682/3051702.

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

 Смежные вопросы

  • Нет связанных вопросов^_^