Russian Qt Forum

Qt => Общие вопросы => Тема начата: Etud от Август 02, 2011, 13:59



Название: Обновление DLL в win7
Отправлено: Etud от Август 02, 2011, 13:59
Известно, что программа не может изменять DLL  (другие данные) в Program Files, так как это системная защищённая папка.

Но программа по дефолту с моими библиотеками устанавливается именно туда.

У меня в программе (установлена C:\Program Files\MyProgram\тут папки) нужно периодически обновлять DLL-ки.

Пока вижу простое решение:
Задать папку с обновляемыми DLL прямо прямо на диске C:\Plugins, в которой и обновляю свои библиотеки.

Недостаток:
Пользователь может удалить эту папку, ведь она на видном месте.

Есть ли другие хорошие решения ?!!


Название: Re: Обновление DLL в win7
Отправлено: Fess от Август 02, 2011, 14:04
1. Качаете обновление в темп (инсталлятор)
2. Кидаете юзеру алерт о том, что есть обновление и оно готово к установке
3. Юзер ставит с нужными правами.


Название: Re: Обновление DLL в win7
Отправлено: Etud от Август 02, 2011, 14:21
Спасибо, и как вариант приемлемо.

Но это ручное обновление, а нужно автоматическое.

Не хочется юзера напрягать установкой, просто нажал кнопку-скачал update.


Название: Re: Обновление DLL в win7
Отправлено: Blackwanderer от Август 02, 2011, 14:24
Копайте в WinAPI. Возможность программно выполнить что-то с админскими правами (если таковые есть) точно существует. В Total Commander есть соответствующие кнопочки для удаления/записи в защищенные каталоги.


Название: Re: Обновление DLL в win7
Отправлено: Etud от Август 02, 2011, 14:27
DLL-ки маленькие (8 КБ) и делать инсталлятор не выгодно.

А искать папку C:\Program Files\MyProgram\Plugins, переносить вручную пользователю сложно.


Название: Re: Обновление DLL в win7
Отправлено: Etud от Август 02, 2011, 14:29
Копайте в WinAPI. Возможность программно выполнить что-то с админскими правами (если таковые есть) точно существует. В Total Commander есть соответствующие кнопочки для удаления/записи в защищенные каталоги.

О, вот видимо верно.

Осталось выяснить как выставить админские права на папку в Win7.


Название: Re: Обновление DLL в win7
Отправлено: Blackwanderer от Август 02, 2011, 14:44
Цитировать
Осталось выяснить как выставить админские права на папку в Win7.
Права выдаются именно на действие: копирование, изменение настроек системы и т.д.


Название: Re: Обновление DLL в win7
Отправлено: Странник от Август 02, 2011, 14:45
по-моему, если пользователь не имеет права записи в папку с программой, лучше вывести сообщение об этом и не извращаться.


Название: Re: Обновление DLL в win7
Отправлено: zenden от Август 02, 2011, 15:18
Вот код запуска программы с повышенными правами:
Код
C++ (Qt)
void RunElevated()
{
       SHELLEXECUTEINFO TempInfo = {0};
       TCHAR buf[MAX_PATH];
       GetModuleFileName(0, buf, MAX_PATH - 1);
       CString s = GetAppFolder();
       TempInfo.cbSize = sizeof(SHELLEXECUTEINFOA);
       TempInfo.fMask = 0;
       TempInfo.hwnd = NULL;
       TempInfo.lpVerb = _T("runas");
       TempInfo.lpFile = buf;
       TempInfo.lpParameters = _T(" /option");
       TempInfo.lpDirectory = s;
       TempInfo.nShow = SW_NORMAL;
 
       ::ShellExecuteEx(&TempInfo);
}

Осталось только обработать параметр командной строки '/option' и выполнять нужные операции с файлами.


Название: Re: Обновление DLL в win7
Отправлено: Etud от Август 02, 2011, 16:01
Оказалось на папку C:\Program Files\MyProgram\Plugins
нужно для Пользователя выставить разрешения на изменение-запись файлов (по умолчанию только чтение).

То есть нужно программно изменить разрешения для моей папки Plugins.

Как это сделать ? Вот что нужно !

Вот код запуска программы с повышенными правами...

А что делает этот код, можно подробнее.

Может это сильно круто - давать повышенные права программе ?!!


Название: Re: Обновление DLL в win7
Отправлено: zenden от Август 02, 2011, 16:10
Может это сильно круто - давать повышенные права программе ?!!

нет, не сильно круто,

(http://www.regen.hu/Win7logonUi/images/uac.gif)
многие программы так делают


Название: Re: Обновление DLL в win7
Отправлено: Etud от Август 02, 2011, 16:29
Т.е. у программы сразу права админа и соответсвенно для папки DLL они работают ?

Так я понял ?


Осталось только обработать параметр командной строки '/option' и выполнять нужные операции с файлами.

тут поподробнее плиз, что обработать...


Название: Re: Обновление DLL в win7
Отправлено: zenden от Август 02, 2011, 17:25


тут поподробнее плиз, что обработать...

Предыдущий код запускает еще одну копию вашей программы с параметром командной строки.
А вот простейший код, анализирующий переданные параметры:

Код
C++ (Qt)
if(QCoreApplication::arguments ().at(1) == "/option")
{
 // ... здесь обновляете DLL и выходите
 // программа обладает админскими правами
}


Название: Re: Обновление DLL в win7
Отправлено: Авварон от Август 02, 2011, 18:12
А почему не назначать права на плагинс при установке программы?:)


Название: Re: Обновление DLL в win7
Отправлено: Etud от Август 02, 2011, 19:43
А почему не назначать права на плагинс при установке программы?:)

да, у меня такая мысль была выше.

как это программно сделать ?


Название: Re: Обновление DLL в win7
Отправлено: fsMark от Август 03, 2011, 12:32
Я решаю проюлему автообновления проще, ставлю в личную папку пользователя, также  делает Google Chrome.

Например для winXP "c:\Documents and Settings\user\Local Settings\Application Data\appname"


Название: Re: Обновление DLL в win7
Отправлено: Fess от Август 03, 2011, 13:43
да, у меня такая мысль была выше.

как это программно сделать ?
а как вы ее устанавливаете? Смотрите возможности инсталлера.
Или используйте Application Data лучше для All Users, а не текущего юзера.