Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать версию MSI файла? 
:(
    Опции темы
RTFM83
Дата 24.9.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 29.12.2008

Репутация: нет
Всего: нет



Добрый день.
Необходимо вытащить версию MSI файла.

FileVersionInfo.GetVersionInfo(file) - ничего хорошего не дает.
Единственный вариант который пришел в голову, это прочитать msi-файл как текстовый файл и выдернуть оттуда версию с помощью регулярного выражения.

Однако мб есть более красивый способ через какой-нить API??
PM MAIL   Вверх
mihryak
Дата 24.9.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(RTFM83 @  24.9.2009,  13:59 Найти цитируемый пост)
есть более красивый способ через какой-нить API?

разумеется
Код

    enum ErrorCode
    {
        Success = 0,
        MoreData = 234
    }

Код

        [DllImport("msi.dll", CharSet = CharSet.Unicode)]
        public static extern ErrorCode MsiOpenPackage(string filename, out IntPtr handle);

        [DllImport("msi.dll", CharSet = CharSet.Unicode)]
        public static extern ErrorCode MsiGetProperty(IntPtr handle, string propertyName,
            [Out] StringBuilder buffer, ref int bufferSize);

Код

        string filename = "c:\\msi.msi";

        public IntPtr GetPackageHandle()
        {
                IntPtr packageHandle;
                ErrorCode code = MSINativeHelper.MsiOpenPackage(
                    filename, out packageHandle);
                if (code != ErrorCode.Success)
                {
                    throw new ArgumentException("Cannot read MSI data", filename);
                }
                return packageHandle;
            }            
        }

        public string GetMSIProperty(string propertyName)
        {
            int bufferSize = 0;
            StringBuilder builder = new StringBuilder(bufferSize);

            ErrorCode code = MsiGetProperty(
                GetPackageHandle(), propertyName, builder, ref bufferSize);
            if (code == ErrorCode.MoreData)
            {
                bufferSize += 1;
                builder.EnsureCapacity(bufferSize);
                if (MSINativeHelper.MsiGetProperty(
                    GetPackageHandle(), propertyName, builder, ref bufferSize) != ErrorCode.Success)
                {
                    throw new ArgumentException("Cannot get property", propertyName);
                }
            }

            return builder.ToString();
        }

тебя скорее всего будет интересовать св-во "ProductVersion"
PM MAIL ICQ   Вверх
RTFM83
Дата 24.9.2009, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 29.12.2008

Репутация: нет
Всего: нет



Спасибо, только у меня переменная code после
Код

                ErrorCode code = MSINativeHelper.MsiOpenPackage(
                    filename, out packageHandle);

равна почемуто 1618 а не 0. - Соответственно исключение генерится :(
PM MAIL   Вверх
mihryak
Дата 24.9.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Код

//
// MessageId: ERROR_INSTALL_ALREADY_RUNNING
//
// MessageText:
//
//  Another installation is already in progress.  Complete that installation before proceeding with this install.
//
#define ERROR_INSTALL_ALREADY_RUNNING    1618L

у тебя какой-то инсталлер уже выполняется
ну и доп. инфу поищи в окрестностях этой ссылки


Это сообщение отредактировал(а) mihryak - 24.9.2009, 16:50
PM MAIL ICQ   Вверх
RTFM83
Дата 24.9.2009, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 29.12.2008

Репутация: нет
Всего: нет



Конечно выполняется, ведь этот код сам же и запускает MSIку эту (я ещё удивился зачем ему это надо...)
Ладно, спасибо за направление, буду копать
PM MAIL   Вверх
mihryak
Дата 24.9.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(RTFM83 @  24.9.2009,  17:49 Найти цитируемый пост)
Конечно выполняется, ведь этот код сам же и запускает MSIку эту (я ещё удивился зачем ему это надо...)

не, выполняется что-то ещё, код просто открывает окно (кстати, можно сделать, чтобы окно не показывалось)
мой способ рабочим должен быть

ещё можно добавить референс на COM-объект WindowsInstaller, по функциональности оба способа должны совпадать, второй по идее будет удобнее в работе, но с ним дела не имел

Добавлено через 14 минут и 45 секунд
поправил код
Код

        static string filename = "c:\\msi.msi";

        public static IntPtr GetPackageHandle()
        {
            IntPtr packageHandle;
            ErrorCode code = MsiOpenPackage(
                filename, out packageHandle);
            if (code != ErrorCode.Success)
            {
                throw new ArgumentException("Cannot read MSI data", filename);
            }
            return packageHandle;
        }

        public static string GetMSIProperty(string propertyName)
        {
            int bufferSize = 0;
            StringBuilder builder = new StringBuilder(bufferSize);
            IntPtr handle = GetPackageHandle();
            ErrorCode code = MsiGetProperty(handle, propertyName, builder, ref bufferSize);
            if (code == ErrorCode.MoreData)
            {
                bufferSize += 1;
                builder.EnsureCapacity(bufferSize);
                if (MsiGetProperty(handle, propertyName, builder, ref bufferSize) != ErrorCode.Success)
                {
                    throw new ArgumentException("Cannot get property", propertyName);
                }
            }
            return builder.ToString();
        }

        enum ErrorCode
        {
            Success = 0,
            MoreData = 234
        }

        [DllImport("msi.dll", CharSet = CharSet.Unicode)]
        static extern ErrorCode MsiOpenPackage(string filename, out IntPtr handle);
        [DllImport("msi.dll", CharSet = CharSet.Unicode)]
        static extern ErrorCode MsiGetProperty(IntPtr handle, string propertyName,
            [Out] StringBuilder buffer, ref int bufferSize);


чтобы не было окна
Код

        [DllImport("msi.dll", CharSet = CharSet.Unicode)]
        public static extern ErrorCode MsiSetInternalUI(UIMode mode, IntPtr windowHandle);

        enum UIMode
        {
            None = 2
        }

        MsiSetInternalUI(UIMode.None, IntPtr.Zero);

PM MAIL ICQ   Вверх
RTFM83
Дата 24.9.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 29.12.2008

Репутация: нет
Всего: нет



Спасибо, теперь заработало smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0668 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.