2015-07-27 8 views
2

Я хотел бы проверить MD5 файл с этим кодом:Сравнить две строки Inno Setup

[Code] 
var 
    MD5Comp: string; 

procedure ExitProcess(uExitCode:UINT); 
    external '[email protected] stdcall'; 

procedure CurStepChanged(CurStep: TSetupStep); 
begin 
    MD5Comp := '32297BCBF4D802298349D06AF5E28059'; 

    if CurStep = ssInstall then 
    begin 

    if not MD5Comp=GetMD5OfFile(ExpandConstant('{app}\cg.npa')) then 
    begin 
    MsgBox('A patched version detected. Setup will now exit.', mbInformation, MB_OK); 
    ExitProcess(1); 
    end; 
    end; 
end; 

Но я получаю ошибку «Несоответствие типов» при сравнении два строки, поэтому я предполагаю, что это не так, как вы их сравниваете.

Редактировать: Я пробовал if not CompareText(MD5Comp,GetMD5OfFile(ExpandConstant('{app}\cg.npa')))=0, но он никогда не выполняет то, что находится внутри if.

+1

К вашему обновлению вам нужно будет написать 'if CompareText (...) = 0 then', потому что 0 означает равенство. – TLama

ответ

6

Это похоже на компилятор Pascal Script. Вы ожидали, что такое выражение, как это (предположим S1 и S2 являются string переменные):

if not (S1 = S2) then 

Но компилятор относился к ней, как это вместо:

if (not S1) = S2 then 

Ну, я бы лично планирующим ошибку компилятора вместо времени выполнения. По крайней мере, у вас есть простой способ обойти эту проблему, если вы явно заключить, что сравнение в скобках, как:

if not (MD5Comp = GetMD5OfFile(ExpandConstant('{app}\cg.npa'))) then 

или необязательно писать более буквально:

if MD5Comp <> GetMD5OfFile(ExpandConstant('{app}\cg.npa')) then 

ли к сведению, что в этом случае круглые скобки не требуется, потому что с оператором <> он становится единственным булевым выражением.

+0

P.S. обратите внимание, что 'GetMD5OfFile' возвращает строчную строку. – TLama

+0

Это сработало, спасибо. – Cypert

+0

Добро пожаловать! P.P.S для этого случая чувствительность чувствительности лучше использовать функцию CompareText, которую вы нашли. – TLama

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