2013-04-18 25 views
5

Khi tôi biên dịch tập lệnh Inno Setup bên dưới, nó cho tôi một lỗi (bên dưới). Tôi đã mượn mã số từ here vì vậy tôi không chắc tại sao mã không hoạt động đúng cách.Cách cài đặt Inno để kiểm tra xem tệp có tồn tại không

Line 136: 
Column 10: 
Invalid prototype for 'FileDoesNotExist' 

Đường dây 136 là function FileDoesNotExist(file: string): Boolean;

[Run] 
Filename: "{sys}\regsvr32.exe"; Parameters: "msstdfmt.dll"; WorkingDir: {app}\Pronto\Programs\; BeforeInstall: FileDoesNotExist(ExpandConstant('{sys}\msstdfmt.dll')); StatusMsg: "Registering Controls..." 

[Code] 
function FileDoesNotExist(file: string): Boolean; 
begin 
    if (FileExists(file)) then 
    begin 
     Result := False; 
    end 
    else 
    begin 
     Result := True; 
    end; 
end; 

Trả lời

3

Từ Inno Setup documentation:

Tất cả BeforeInstall và AfterInstall chức năng không phải có một giá trị trả về.

Nói cách khác, nó không thể là function, bởi vì nó không thể trả lại bất kỳ thứ gì; thay vào đó, nó là procedure. (Bạn có thể thấy từ các ví dụ trong trang được liên kết mà tất cả chúng đều được khai báo là procedure và không có mã nào trong số đó có chứa mã Result.)

(Câu hỏi bạn đã liên kết cũng sai, BTW. procedure có kiểu trả về là Boolean, điều này tất nhiên là không thể. Tôi nghi ngờ rằng nếu nó hoạt động thì đó là do trình phân tích cú pháp Pascal đã sử dụng không nhận thấy giá trị trả về vì số procedure trong khai báo.)

Dường như bạn đang cố gắng làm điều đó sai. Nếu msstdfmt.dll đang được phân phối với setup, bạn nên thêm nó vào phần [Files] với các cờ onlyifdoesntexistregserver được đặt. Nếu nó đã được cài đặt trên hệ thống của người dùng, nó đã được đăng ký.

[Files] 
Source: "msstdfmt.dll"; DestDir: "{sys}"; Flags: onlyifdoesntexist regserver 
+1

Thực ra bạn thường không nên quan tâm liệu nó có tồn tại hay không. Chỉ cần sử dụng các giá trị mặc định (ví dụ: không phải "bỏ qua"), điều này làm cho nó cài đặt tệp nếu nó sẽ nâng cấp nó và để nó một mình nếu không. – Miral

Các vấn đề liên quan