Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2009, 15:21   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию Silent installtion. Как?

Приветствую.
Задача такова: Есть инсталлятор приложения допустим всем известный AdbeRdr910_en_US.exe - Acrobat Reader. Значит я должен

1. Начать сканирование на изменения в папке Programs Files. Т.е. ReadDirectoryChangesW

2. Запустить инсталляцию. Запускаю с известными параметрами
Цитата:
/sAll /rs /l /msi"/qb-! /norestart ALLUSERS=1 EULA_ACCEPT=YES SUPPRESS_APP_LAUNCH=YES"
(тут так же либо ошибка моя либо нет, но появляется прогресс бар, а его не должно быть)

3. Дождаться завершения работы инсталлятора

4. Закончить сканирование директории.

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

Собственно проблема в том, что такое ощущение, что сам инсталлятора адоба завершает свою работу и передает ее msi инсталлятору, и только потом msi уже ставит файлы, но я то жду именно adobe, и поэтому схема получение полного пути приложения не срабатывает, т.к. список хранит только какой-то один файл и все. Что думаите ?

Как делаю в виде кода:
Код:
static CString ProgramFilesX86;
static CString ProgramFiles;
static HANDLE hProgramFilesX86 = INVALID_HANDLE_VALUE;
static HANDLE hProgramFiles = INVALID_HANDLE_VALUE;

bool ReadDirectory(HANDLE hDir, CString *Dir, BYTE *lpBuffer, DWORD nBufferLength, OVERLAPPED *o)
{
	DWORD returnedBytes = 0;
	memset(lpBuffer, 0, nBufferLength);
	ReadDirectoryChangesW(hDir, lpBuffer, nBufferLength, TRUE,
		FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE |
		FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_CREATION, 
		&returnedBytes, o, 0);

	DWORD dwWaitStatus = WaitForSingleObject(o->hEvent, 100);

	switch(dwWaitStatus)
	{ 
	case WAIT_OBJECT_0: 
		{
			DWORD seek = 0;
			while(seek < nBufferLength)
			{
				PFILE_NOTIFY_INFORMATION pNotify = PFILE_NOTIFY_INFORMATION(lpBuffer + seek);
				seek += pNotify->NextEntryOffset;

				WCHAR szwFileName[MAX_PATH];
				ULONG ulCount = min(pNotify->FileNameLength / 2, MAX_PATH-1);
				wcsncpy_s(szwFileName, pNotify->FileName, ulCount);
				szwFileName[ulCount] = L'\0';

				CString s = *Dir + L"\\";
				s += szwFileName;
                                             // s - полный путь к файлу, вновь записанному или созданному.
 
				if(pNotify->NextEntryOffset == 0)
				{
					break;
				}
			}
			return TRUE;
		}
		break; 
	}

	return FALSE;
}
Остальная часть кода не столь важна. Ну если уж все, то инициализация статический данных просиходит так
Код:
if(ProgramFilesX86.IsEmpty())
	{
		wchar_t buf[MAX_PATH];
		SHGetSpecialFolderPath(NULL, buf, CSIDL_PROGRAM_FILESX86, FALSE);
		ProgramFilesX86 = buf;

		if(!ProgramFilesX86.IsEmpty())
		{
			hProgramFilesX86 = CreateFile(ProgramFilesX86.GetBuffer(),
				GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 
				FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL);
		}
	}

	if(ProgramFiles.IsEmpty())
	{
		wchar_t buf[MAX_PATH];
		SHGetSpecialFolderPath(NULL, buf, CSIDL_PROGRAM_FILES, FALSE);
		ProgramFiles = buf;

		if(!ProgramFiles.IsEmpty())
		{
			hProgramFiles = CreateFile(ProgramFiles.GetBuffer(),
				GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 
				FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL);
		}
	}

Задача решена. Все работает. Дело в том что просто Adobe видит что уже установлен и не ставит поверх теже файлы, если делать чистую установку то все файлы отлавливаются нормально.

Последний раз редактировалось BOBAH13; 09.09.2009 в 16:17.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц