все что связано с моей работой
Главная » Учебник WiX » Чего нет в книге

Чего нет в книге

Для очень специализированных действий, для которых Windows Installer не может предоставить решения (например, проверка законности и целостности регистрационного ключа, введенного пользователем), можно использовать еще один тип настраиваемого действия: DLL которую мы сами напишем. Для нашего примера мы используем упрощенный подход: мы примем пользовательский ключ, если его первая цифра будет ‘1’.

Следующий исходный код может быть скомпилирован в Visual C++. С минимальными изменениями, если таковые потребуются, исходник может быть скомпилирован любым компилятором. msi.h и msiquery.h заголовочные файлы можно взять из SDK MSI. Вы также должны “соединиться” с msi.lib.

#include 
#include 
#include 

#pragma comment(linker, "/EXPORT:CheckPID=_CheckPID@4")

extern "C" UINT __stdcall CheckPID (MSIHANDLE hInstall) {
  char Pid[MAX_PATH];
  DWORD PidLen = MAX_PATH;

  MsiGetProperty (hInstall, "PIDKEY", Pid, &PidLen);
  MsiSetProperty (hInstall, "PIDACCEPTED", Pid[0] == '1' ? "1" : "0");
  return ERROR_SUCCESS;
}

Чтобы использовать эту DLL, добавьте следующие строки в соответствующие места (теперь, приближаясь к концу третьего урока, Вы могли бы уже сами сделать это, но если Вы хотите – то, можете загрузить SampleCA.)


  





  
  PIDACCEPTED = "0" AND NOT Installed


Подводя итог: во-первых, мы не позволим установщику работать с урезанным или отсутствующим UI, потому что пользователь не сможет ввести регистрационный ключ в этих случаях. Причина уродливой обертки CDATA в том, что XML приписывает особое значение некоторым символам, особенно “<” и “>”. Везде, где они появляются в различном контексте, имея в виду знаки меньше или больше, мы  должны их экранировать, обертывая выражение в CDATA. Хотя в нашем случае мы могли обойтись и без этого, потому у нас проверяется равенство, но это очень хорошая привычка обертывать все подобные условные значения на всякий случай, избегая конфликтов XML.

У нас есть действие под названием CheckingPID, идущее за CostFinalize. Это действие вызовет функцию CheckPID из нашей CheckPID.dll. DLL устанавливает свойство PIDACCEPTED или в 1 или в 0 согласно его решению о законности пользовательского ключа, введенного и сохраненного в свойство PIDKEY. Заметьте, что использование свойств (прописными, иначе Windows Installer не будет обрабатывать их как общедоступные свойства) является единственным способом передать параметры в и от настраиваемое действие.

У нас есть второе действие под названием RefusePID, которое, будет выполнятся сразу после нашего внешнего. Это — условное действие, которое выполняется, если возвращенное свойство PIDACCEPTED, является нулем. В этом случае оно выведет на экран сообщение об ошибке и прервет установку. И будет использоваться это значение только во время установки, а не, в то время когда мы удаляем продукт.

Чтобы понять, как эти действия вызываются и как они пересекаются друг с другом, мы могли бы запустить установку с подробным журналированием. Поскольку это будет очень подробно, используя текстовый редактор и найдя наше свойство и имена пользовательского действия (искать по слову “PID”), можно посмотреть что действительно происходит.

msiexec /i SampleCA.msi /l*v SampleCA.log

Если DLL, которую мы должны вызвать, была установлена, а не просто включена в пакет, мы можем использовать:

Комментариев нет

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.