Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Пользовательские действия WiX являются замечательной моделью для следования. В этом случае Вы только объявляете, с CustomAction
, незамедлительное принятие мер, запаздывающее действие и действие отката. Вы только планируете, с Custom
, незамедлительное принятие мер, где незамедлительное принятие мер реализовано как код в собственном DLL.
Затем в незамедлительном принятии мер код , Вы звоните MsiDoAction
для планирования отката и запаздывающих действий: поскольку они задерживаются, они записаны в сценарий в точке, которую Вы называете MsiDoAction
, а не выполненный сразу. Необходимо будет звонить MsiSetProperty
также для установки данных пользовательского действия.
Загрузка исходный код WiX и учатся как IISExtension
работы, например. Действия WiX обычно анализируют пользовательскую таблицу и генерируют данные для свойства запаздывающего действия на основе той таблицы.
Если у Вас есть сложные пользовательские действия, которые должны поддерживать откат, Вы могли бы рассмотреть запись расширения Wix. Расширения обычно оказывают авторскую поддержку (т.е. новые XML-тэги, которые отображаются на записях таблицы MSI), плюс автоматическое планирование пользовательских действий.
Это - больше работы, чем просто запись пользовательского действия, но однажды Ваша АВАРИЯ достигают определенного уровня сложности, простота авторской разработки, которую обеспечивают расширения, может стоить того.