Да, но вам нужны правильные ожидания. Если у вас нет дескриптора установщика, который вы получаете, когда вызывается в контексте установщика, многие из API установщика Windows, включая MsiGetProperty, не могут использоваться.
В зависимости от ваших конкретных потребностей, я бы предложил разделить вашу реализацию на три функции. Одним из них является основная реализация. Любые значения, которые вы в настоящее время получаете с помощью MsiGetProperty, могут быть аргументами этой функции. Любое ведение журнала должно выполняться через помощника, которого вы можете настроить для использования альтернативных средств и т. Д. Эта функция не должна экспортироваться вашей DLL.
Тогда две другие функции должны быть довольно тонкими обертками вокруг этой функции. Они получают значения любым способом, который имеет смысл для их вызова, и передают их основной реализации. Эти две функции экспортируются.
Затем вызовите подходящую функцию для вашего использования, и большая часть вашей DLL может быть легко распределена между вызовами как пользовательских, так и не пользовательских действий.