2013-03-09 2 views
0

В моем проекте У меня есть файлы для копирования в каталог файлов программ и создание ярлыка для одного исполняемого файла, а другое - как установка.Сделать установщик с Delphi

Я хочу сделать это в своем приложении с файлами хранилища в Пакетах, например, CAB-файлами и показать установку в индикаторе выполнения.

Сначала я думаю о оболочке msi, но некоторые пользователи сказали, что это так медленно!

Как я могу сделать это наилучшим образом?

+2

Просто комментарий. Мне лично не нравится MSI из-за его медлительности. Многие приложения используют NSIS или Inno Setup. Они быстрые, легкие и гибкие. – Abelisto

+0

Да, я знаю, но мне нужно установить ход установки в моем приложении. Есть ли другое решение? – sma6871

+0

Итак, вы хотите показать, как реализовать, например. ['this example'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa368786 (v = vs.85) .aspx) в Delphi. С JEDI JWA вы будете на полпути. Может быть, я вернусь с образцом кода (если кто-то не будет быстрее). – TLama

ответ

4

Вот небольшой шаблон для начала:

unit Unit1; 

interface 

uses 
    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls, 
    StdCtrls 
    , JwaMsi, windows // Units needed for MSI manipulation & for some type declarations 

type 

    { TForm1 } 

    TForm1 = class(TForm) 
     btnDoIt: TButton; 
     lbxMsg: TListBox; 
     procedure btnDoItClick(Sender: TObject); 
    private 
     { private declarations } 
    public 
     { public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

// Callback function 
// Here you must handle type and content of messages from MSI (see MSDN for details) 
function MSICallback(pvContext: LPVOID; iMessageType: Cardinal; szMessage: LPCSTR): Integer; stdcall; 
var 
    s: string; 
begin 
    // Convert PChar to string. Just for convenience. 
    s := szMessage; 

    // Add info about message to the ListBox 
    Form1.lbxMsg.Items.Add(Format('Type: %d, Msg: %s', [iMessageType, s])); 

    // Repaint form (may be it is not necessary) 
    Form1.Refresh; 
    Application.ProcessMessages; 

    If iMessageType = INSTALLMESSAGE_TERMINATE then 
     ShowMessage('Done'); 
end; 

{ TForm1 } 

procedure TForm1.btnDoItClick(Sender: TObject); 
begin 
    // Do not show native MSI UI 
    MsiSetInternalUI(INSTALLUILEVEL_NONE + INSTALLUILEVEL_SOURCERESONLY, nil); 

    // Set hook to MSI 
    MsiSetExternalUI(
     @MSICallback, // Callback function 
     $FFFFFFFF, // Receive all types of messages 
     nil); 

    // Install product (change path to installation package) 
    MsiInstallProduct(
     'D:\install\games\_old\corewar\nMarsFull.0.9.5.win.msi', 
     nil); 
end; 

end. 
+1

Этот код показывает, как установить из существующего .msi. Простой ShellExecute справится с этим. Но большая проблема заключается в том, что @ sma6871 на самом деле хочет создать .msi. –

+0

@David, вопрос, когда я получаю его, теперь просит установщика, который сможет отображать ход установки в панели выполнения приложения Delphi. – TLama

+0

@Abelisto, Спасибо, это работает для меня очень хорошо. Но мне нужно проанализировать 'INSTALLMESSAGE_PROGRESS', [this] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa368786 (v = vs.85) .aspx) и [this] (http : //msdn.microsoft.com/en-us/library/Aa370573), ссылки очень хорошие, но я не могу их использовать в delphi. Я не могу получить доступ к подтипам 'INSTALLMESSAGE_PROGRESS' !!! – sma6871