У меня есть два приложения, над которыми я работаю, каждое из которых использует вызов MSIGetProductInfo для получения серийного номера, который пользователь ввел во время установки (стандартный проект установки и развертывания Visual Studio).
Вот код, который я использую для получения серийного номера:
Int32 len = 512;
var builder = new StringBuilder(len);
MsiGetProductInfo("{98A0A10F-5E78-4FA6-83F6-6B356D75ADD4}", "ProductId", builder, ref len);
return builder.ToString();
Первое приложение, визуальное приложение на формах c #, возвращается так, как я ожидаю (когда я ввожу 1111-1111-1111-1111, оно отображается как таковое). Однако, когда я помещаю один и тот же вызов в метод OnStart службы Windows c #, я получаю случайный мусор, такой как символы Юникода, иногда слово, и возвращаемое значение отличается в каждой среде выполнения. Иногда я получаю результат, который содержит часть пути библиотеки DLL, которая содержит вызов MsiGetProductInfo, такой как «꿈 H 꿈 Eindows \ system32 \ msi.dll».
Мне кажется (необразованное предположение), что вызов функции dll не удался, и он просто возвращает данные из неиспользуемой области памяти.
Я попытался прочитать другие свойства, такие как InstallSource и InstalledProductName, но они также являются мусором в службе (хотя в приложении форм также хорошо работают). Я также подумал, что это может быть проблема с разрешениями, поэтому я попытался запустить службу под учетными записями NetworkService, LocalService и LocalSystem, но безуспешно.
Приложение Forms и служба устанавливаются одновременно одним и тем же проектом установки, поэтому они должны использовать один и тот же код продукта, верно? Если нет, я мог понять, почему службе не удается получить информацию о продукте.
Кто-нибудь сталкивался с этим или имеет какое-либо представление о причинах этого?