2015-09-16 2 views
0

Мне нужен раздел [InstallDelete], чтобы вызвать пользовательскую функцию, которая будет проверять, установлена ​​ли старая версия (в этом случае определенные файлы необходимо удалить перед установкой новой версии).Функция Inno Setup не называется

Извлечение из моего сценария установки Inno. Сначала функция, возвращающая True, если установлена ​​более старая версия.

[Code] 
function deleteExistingHhd: Boolean; 
var Version: String; 
begin 
    MsgBox('Checking for key:'+'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ExpandConstant('AppId')+'_is1', mbInformation, MB_OK); 

    if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ExpandConstant('AppId')+'_is1', 'DisplayVersion') then 
    begin 
     RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ExpandConstant('AppId')+'_is1', 'DisplayVersion', Version); 
     MsgBox('Existing version:'+Version+' New version:'+ExpandConstant('AppVersion'), mbInformation, MB_OK); 
     if (Version < '1.013') then 
     begin 
      Result := True; 
     end 
     else 
     begin 
      Result := False; 
     end 
    end 
    else 
    begin 
     Result := False; 
    end 
end; 

Затем раздел, который должен вызвать эту функцию:

[InstallDelete] 
Type: files; Name: {userappdata}\xxx\*.hhd; Check:deleteExistingHhd; 

К сожалению, генерируемая установка, кажется, никогда не вызывать пользовательскую функцию (при установке моей программы с этой установкой я никогда не получите MsgBox, расположенной в пользовательская функция и файлы не удаляются).

Возможно ли, что моя функция имеет некоторые ошибки, которые не указаны при компиляции Inno Setup? Если да, где я могу их найти?

Любая помощь/подсказка была бы очень оценена; благодаря!

+0

я, что вы ** Ошибка ** в ** ExpandConstant ('APPID') ** и ** ExpandConstant ('AppVersion') ** – IZB

+0

Спасибо, но это не ошибка: мне нужно найти реестр на основе AppID (GUID). Помимо определения конкретной ошибки здесь более общий вопрос: где я могу найти журнал ошибок, который указывает, откуда происходит ошибка? – Tom

+0

Я имею в виду, что код не работает, потому что ** ExpandConstant ('AppId') ** он не дает вам AppId (GUID).если вы хотите это сделать, вы можете использовать ** # define AppId SetupSetting ('AppId') ** и называть его с помощью ** ExpandConstant ('{# AppId}') ** – IZB

ответ

1

Если MsgBox никогда не вызывается, есть что-то еще не так.
Я создал новый проект, вставил ваши строки как есть, и всплыло первое всплывающее окно msgbox.

Возможно, просто запустите новое и продолжайте добавлять части из своего старого сценария установки, пока не найдете то, что останавливает выполнение функции.

Знаете ли вы, что можете выполнить код с помощью F7 и/или точек останова F5? Это должно помочь вам найти проблему. Он должен пойти: [InstallDelete] -> [Dirs] -> [Files]

@IZB прав, ExpandConstant ('AppId') будет разрешен как AppId, а не фактический Я БЫ. Проверьте вывод из раздела отладки. Я добавил ваш скрипт ниже. Следите за выходом «Отладка» в нижней части компилятора Inno Seput при выполнении кода.

И вам также нужен ExpandConstant :), потому что в противном случае вы получите ведущий '{' в два раза. Он должен быть удвоен в разделе [Setup], чтобы избежать символа скобки. Прекомпилятор также передаст верхнюю скобку escape, используя #SetupSetting («AppId»). ExpandConstant фактически не будет расширять любую константу, но удалит этот удвоенный предмет.

Вот паста полного рабочего ISS файла:

#define MyAppName "My Program" 
#define MyAppVersion "1.5" 
#define MyAppPublisher "My Company, Inc." 
#define MyAppURL "http://www.example.com/" 
#define MyAppExeName "MyProg.exe" 

[Setup] 
AppId={{CB77C990-DECF-4697-B377-8F76799CC6B7} 
AppName={#MyAppName} 
AppVersion={#MyAppVersion} 
;AppVerName={#MyAppName} {#MyAppVersion} 
AppPublisher={#MyAppPublisher} 
AppPublisherURL={#MyAppURL} 
AppSupportURL={#MyAppURL} 
AppUpdatesURL={#MyAppURL} 
DefaultDirName={pf}\{#MyAppName} 
DefaultGroupName={#MyAppName} 
OutputBaseFilename=setup 
Compression=lzma 
SolidCompression=yes 

[Code] 
function deleteExistingHhd: Boolean; 
var Version: String; 
begin 

    // Debugging 
    // {#SetupSetting("AppId")} is short from {#emit SetupSetting("AppId")} 
    Log('Note the double bracket: {#SetupSetting("AppId")}'); 
    Log('Now it''s fine: ' + ExpandConstant('{# SetupSetting("AppId")}')); 
    Log(' This won''t expand: ' + ExpandConstant('AppId')); 

    if RegValueExists(HKEY_LOCAL_MACHINE,ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppId")}_is1'), 'DisplayVersion') then 
    begin 
     RegQueryStringValue(HKEY_LOCAL_MACHINE,ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppId")}_is1'), 'DisplayVersion', Version); 
     MsgBox('Existing version:' + Version + ' New version:{#SetupSetting("AppVersion")}', mbInformation, MB_OK); 
     if (Version < '1.013') then Result := True 
     else Result := False; 
    end 
    else Result := False; 
end; 

[InstallDelete] 
Type: files; Name: {userappdata}\xxx\*.hhd; Check: deleteExistingHhd 
+0

только что пришло мне в голову, возможно, вы ожидаете, что он запустится в начале установки. Но разделы установщика как [InstallDelete] обрабатываются позже, только после нажатия кнопки Install, непосредственно перед фактической частью установки. – papo

0

Если вы хотите unistall его перед установкой его новыми вы можете использовать этот код:

#define AppName SetupSetting('AppName')  
#define AppVersion SetupSetting('AppVersion') 
#define AppId SetupSetting('AppId')    
#if AppId == "" 
    #define AppId AppName 
#endif 

[Code] 
procedure InitializeWizard; 
var 
    Uninstall,Version: String; 
    ResultCode:Integer; 
begin 
    MsgBox('Checking for key:'+'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ExpandConstant('{#AppId}')+'_is1', mbInformation, MB_OK); 
    if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ExpandConstant('{#AppId}')+'_is1', 'DisplayVersion') then begin 
     RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ExpandConstant('{#AppId}')+'_is1', 'DisplayVersion', Version); 
     MsgBox('Existing version:'+Version+' New version:'+ExpandConstant('{#AppVersion}'), mbInformation, MB_OK); 
     if (Version < ExpandConstant('{#AppVersion}')) then begin    
      RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ExpandConstant('{#AppId}')+'_is1','UninstallString', Uninstall); 
      Exec(RemoveQuotes(Uninstall), ' /RECAll /SILENT' , '', SW_SHOW, ewWaitUntilTerminated, ResultCode); 
     end 
    end 
end; 

Я думаю, что я буду держать выше код и для вас проблемы может это поможет:

#define AppName SetupSetting('AppName')  
#define AppVersion SetupSetting('AppVersion') 
#define AppId SetupSetting('AppId')    
#if AppId == "" 
    #define AppId AppName 
#endif 

[InstallDelete] 
Type: files; Name: {userappdata}\xxx\*.hhd; Check:deleteExistingHhd; 

[Code] 
function deleteExistingHhd: Boolean; 
var Version: String; 
begin 
    MsgBox('Checking for key:'+'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ExpandConstant('{#AppId}')+'_is1', mbInformation, MB_OK);                                                            
    if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ExpandConstant('{#AppId}')+'_is1', 'DisplayVersion') then begin 
    RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ExpandConstant('{#AppId}')+'_is1', 'DisplayVersion', Version); 
    MsgBox('Existing version:'+Version+' New version:'+ExpandConstant('{#AppVersion}'), mbInformation, MB_OK); 
    if (Version < '1.013') then begin 
     Result := True; 
    end else Result := False; 
    end else Result := False; 
end; 
+0

Спасибо, но я не хочу удалять, просто удалите определенные файлы – Tom

 Смежные вопросы

  • Нет связанных вопросов^_^