InnoSetup MsiQueryProductState - PullRequest
       33

InnoSetup MsiQueryProductState

4 голосов
/ 07 октября 2011

Я хочу заменить настройку VS на Inno Setup.Проверьте, установлена ​​ли старая версия, я нашел метод «MsiQueryProductState».Я нашел несколько примеров, которые выглядят так:

function MsiQueryProductState(ProductCode: string): integer;
  external 'MsiQueryProductStateA@msi.dll stdcall';
function MsiConfigureProduct(ProductCode: string;
  iInstallLevel: integer; eInstallState: integer): integer;
  external 'MsiConfigureProductA@msi.dll stdcall';
const
  INSTALLSTATE_DEFAULT = 5;
  INSTALLLEVEL_MAXIMUM = $ffff;
  INSTALLSTATE_ABSENT = 2;

При проверке продукта всегда возвращается 2, а не требуемое значение 5 (INSTALLSTATE_DEFAULT)

Я обнаружил ошибку, выложу ее какответ ...

Спасибо, Фредди

1 Ответ

4 голосов
/ 11 октября 2011

Проблема была в версии InnoSetup для Unicode, смешанной с ANSI-версией прототипа функции.Достаточно было заменить MsiQueryProductStateA на MsiQueryProductStateW.

. Если вы используете этот условно определенный скрипт, препроцессор компиляции InnoSetup найдет правильную версию для функций (Unicode или ANSI).в зависимости от того, когда вы используете ANSI или Unicode InnoSetup.

[Code]
#IFDEF UNICODE
  #DEFINE AW "W"
#ELSE
  #DEFINE AW "A"
#ENDIF

function MsiQueryProductState(ProductCode: string): integer;
  external 'MsiQueryProductState{#AW}@msi.dll stdcall';
function MsiConfigureProduct(ProductCode: string;
  iInstallLevel: integer; eInstallState: integer): integer;
  external 'MsiConfigureProduct{#AW}@msi.dll stdcall';
...