Игнорируя строки отладки, легче увидеть, что обработка буфера некорректна.Я бы также предложил вывести возвращаемые значения из MsiGetPropertyA()
и значение в dwValue
для подтверждения, но я думаю, что вот что происходит (комментарии относятся к dwValue
):
char szBuff[1024]; DWORD dwValue = 0;
MsiGetPropertyA(hInstall, "UPGRADINGPRODUCTCODE", szBuff, &dwValue); // passes 0, updated to ?x?
MsiGetPropertyA(hInstall, "WIX_UPGRADE_DETECTED", szBuff, &dwValue); // passes ?x?, updated to ?y?
При запросе UPGRADINGPRODUCTCODE
свойство с заявленной длиной буфера ноль, выборка никогда не будет успешной, поскольку она всегда должна принимать по крайней мере нулевой символ.Таким образом, это вернет ERROR_MORE_DATA
и установит dwValue
на длину, исключающую нулевой символ (?x?
).
Затем он запросит значение WIX_UPGRADE_DETECTED
с заявленной длиной буфера (?x?
).Если новая длина (?y?
) меньше старой длины (?x?
), вы получите ее содержимое в своем буфере;в противном случае он также просто запросит длину этого нового свойства.
Поскольку WIX_UPGRADE_DETECTED
содержит список из одного или нескольких идентификаторов GUID, а UPGRADINGPRODUCTCODE
содержит только один, и этот код никогда не увеличивает dwValue
на счетдля нуля, это возможно только успешно, если последний ?y?
равен 0 (пусто) и ?x?
не пусто.Но обратите внимание, что этот второй вызов передал непроверенное значение в качестве длины вашего буфера, этот шаблон является переполнением буфера, ожидающим выполнения.
Так что исправьте обработку вашего буфера.Шаблон, который мне нравится использовать (ниже), похож на тот, что описывает Стейн, но избегает второго вызова, если я знаю хороший размер по умолчанию для буфера.В вашем случае это звучит так, как будто вы довольны буфером из 1024 элементов, но подумайте, нужно ли вам обрабатывать более 1024 / len (GUID) кодов обновления.
(Полагаю, вы 'все хорошо. Но, по крайней мере, продумайте это. И хотя GUID являются ASCII, поэтому содержимое не имеет значения, пожалуйста, пожалуйста, соберите UNICODE в эти дни ...)
WCHAR szBuf[1024];
DWORD cchBuf = 1024; // or _countof(szBuf);
DWORD dwErr = MsiGetPropertyW(hInstall, L"UPGRADINGPRODUCTCODE", szBuf, &cchBuf);
if (dwErr != ERROR_MORE_DATA) {
// exercise: increment cchBuf for null, adjust buffer, call MsiGetPropertyW again
}
if (dwErr != ERROR_SUCCESS) {
// per https://docs.microsoft.com/en-us/windows/desktop/msi/custom-action-return-values
return ERROR_INSTALL_FAILURE;
}
// reset buffer length for next call, in case second property is longer than first
cchBuf = 1024;
dwErr = MsiGetPropertyW(hInstall, L"WIX_UPGRADE_DETECTED", szBuf, &cchBuf);
// : : :