Jump to content


This is a ready-only archive of the InstallSite Forum. You cannot post any new content here. / Dies ist ein Archiv des InstallSite Forums. Hier können keine neuen Beiträge veröffentlicht werden.
Photo

ProgressBar in der UI Sequence


5 replies to this topic

Michael.Hu

Michael.Hu
  • Full Members
  • 72 posts

Posted 25 June 2008 - 15:11

Hallo zusammen!

Habe gerade erfolgreich eine ProgressBar implementiert welche den Fortschritt einer Deferred CustomAction in der Execution Sequence anzeigt.

Nun möchte ich eine solche ProgressBar auch in der UI Sequence verwenden um die Wartezeit meiner Hardware-Checks zu Beginn der Installation etwas zu überbrücken.

Ich habe immer wieder gelesen dass eine ProgressBar NUR mit Deferred CustomActions zusammenarbeitet... Nun geht das ja leider in der UI Sequence nicht...

Komischerweise funktioniert die ProgressBar mit Immediate CustomActions in der UI Sequence so halb... d.h. der ActionData-Text (z.B. "Incrementing tick 3 of 10") wird upgedadet, die ProgressBar rührt sich aber nicht.

Ich habe offensichtlich das gleiche Problem wie LindaT in diesem Post:
http://forum.install...iprocessmessage

LindaT scheint in der letzen Antwort eine Lösung gefunden zu haben ich werd aber nicht schlau daraus...

Hat jemand vielleicht das gleiche auch schon versucht? Eine ProgressBar in der UI Sequenz ist ja eigentlich nicht abwegig oder?

Viele Grüsse
Michael

Edited by Michael.Hu, 25 June 2008 - 15:12.


Michael.Hu

Michael.Hu
  • Full Members
  • 72 posts

Posted 25 June 2008 - 15:14

Natürlich möchte ich euch den Code nicht vorenthalten... vielleicht möchte jemand mal das gleiche tun... ACHTUNG: Das Beispiel funktioniert aber nur wenn DoProgress als Deferred CA in der Execution Sequence ausgeführt wird.

Zudem muss die ProgressBar folgende 2 Events abonnieren:
  • SetProgress (Attribut: Progress)
  • DoSomeProgress (Attribut: Progress)
IMMEDIATE CUSTOM ACTION (zwischen InstallInitialize und InstallFinalize gleich VOR der DoSomeProgress CA)

CODE


function AddTotalProgressTicks(hMSI)  

NUMBER iResult;
HWND hProgRec;

begin

hProgRec = MsiCreateRecord(3);
MsiRecordSetInteger(hProgRec,1,3);
MsiRecordSetInteger(hProgRec,2,5000000);
MsiRecordSetInteger(hProgRec,3,0);

MsiProcessMessage(hMSI , INSTALLMESSAGE_PROGRESS, hProgRec);

MsiCloseHandle(hProgRec);

return ERROR_SUCCESS;
end;



DEFERRED CUSTOM ACTION (zwischen InstallInitialize und InstallFinalize)

CODE

function DoSomeProgress(hMSI)  
NUMBER iResult, iCount;
HWND hActionRec, hProgRec;
NUMBER nvBufferSize;
STRING szTmp;

begin

hActionRec = MsiCreateRecord(3);
   hProgRec = MsiCreateRecord(3);
   
   
MsiRecordSetString(hActionRec, 1, "SomeName");
MsiRecordSetString(hActionRec, 2, "Incrementing Progress Bar...");
MsiRecordSetString(hActionRec, 3, "Incrementing tick [1] of [2]");
                               
MsiProcessMessage(hMSI, INSTALLMESSAGE_ACTIONSTART, hActionRec);

                               
// Tell the installer to use explicit progress messages.
MsiRecordSetInteger(hProgRec, 1, 1);
MsiRecordSetInteger(hProgRec, 2, 1);
MsiRecordSetInteger(hProgRec, 3, 0);
MsiProcessMessage(hMSI, INSTALLMESSAGE_PROGRESS, hProgRec);

//Specify that an update of the progress bar's position in
//this case means to move it forward by one increment.
MsiRecordSetInteger(hProgRec, 1, 2);
MsiRecordSetInteger(hProgRec, 2, 1000);
MsiRecordSetInteger(hProgRec, 3, 0);

// Used for ActionData message
MsiRecordSetInteger(hActionRec, 2, 5000000);

for iCount = 0 to 5000000 step 1000
   
    // Used for ActionData message
    MsiRecordSetInteger(hActionRec, 1, iCount);

       // Create ActionData message
 iResult = MsiProcessMessage(hMSI, INSTALLMESSAGE_ACTIONDATA, hActionRec);
 
 if (iResult = IDCANCEL) then
  // User has pressed Cancel
        return ERROR_INSTALL_USEREXIT;
       endif;
 
 // Create the progress message to increase the progress    
 iResult = MsiProcessMessage(hMSI, INSTALLMESSAGE_PROGRESS, hProgRec);

 if (iResult = IDCANCEL) then
  // User has pressed Cancel  
        return ERROR_INSTALL_USEREXIT;
       endif;
   
endfor;


MsiCloseHandle(hActionRec);
MsiCloseHandle(hProgRec);

return ERROR_SUCCESS;

end;

Edited by Michael.Hu, 25 June 2008 - 15:27.


Freeme

Freeme
  • Full Members
  • 39 posts

Posted 09 December 2008 - 09:41

Hallo Michael.Hu

Ich bin neu bei Installscript.
Ich habe dein Script in zwei CA's eingebaut.
Ich möchte es einsetzen damit der Progressbar aktualisiert wird, mit einer anderen CA, welche eine externe MSI im silent mode ausführt.
Dazu habe ich einige Fragen:
1. Wie stelle ich sicher, dass der Progressbar mit der gerade gewünschten Installations-CA arbeitet? (ich habe mehrere solche CA's, welche eine externe MSI oder exe im silent mode ansteuern)
2. Wie kriege ich heraus, wieviele Ticks die entsprechende Installation hat?

Danke für die Hilfe

Gruss
Thomas


Michael.Hu

Michael.Hu
  • Full Members
  • 72 posts

Posted 09 December 2008 - 09:52

Hi Thomas!

Ich konnte leider nie nachvollziehen wie "LindaT" den obigen Code zum laufen gekriegt hat...

Vielleicht hat jemand anders ein lauffähiges ProgressBar-Beispiel das er mal posten könnte, wäre wirlich sehr interessant!!

Sorry!

Gruss
Michael

Michael.Hu

Michael.Hu
  • Full Members
  • 72 posts

Posted 09 December 2008 - 09:54

Thomas, hab grad ein bisschen gegoogelt und das hier gefunden, vielleicht hilft dir das weiter:

http://msdn.microsof...525(VS.85).aspx

Gib mir Bescheid wenn dus zum laufen gekriegt hast ;-)

Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 12 December 2008 - 13:23

Soweit ich weiß funktioniert der Progress Bar nur in der Execute Sequenz, und dort kann man keine anderen MSI Setups aufrufen. Installiere die anderen MSIs besser als Prerequisite or als "chained MSIs".