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

Verzeichnisattribute ändern


7 replies to this topic

DrHVoss

DrHVoss
  • Members
  • 6 posts

Posted 02 November 2005 - 09:53

Während der Installation wird unterhalb des Anwendungsverzeichnisses ein spezielles Verzeichnis über Createfolder in einer eigenen Komponente erzeugt. Nach dem Erstellen dieses speziellen Verzeichnisses möchte ich mittels einer benutzerdefinierten Aktion per VBScript die Attribute System und Versteckt setzen (habe keine andere Möglichkeit gefunden!?). Wo genau muss diese CA sequenziert werden?

Bitte um Hilfe!

Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 02 November 2005 - 11:31

Deferred anch CreateFolder

DrHVoss

DrHVoss
  • Members
  • 6 posts

Posted 02 November 2005 - 11:42

Sehr geehrter Herr Krüger,

vielen Dank für Ihre schnelle Antwort. Das Problem mit verzögert nach CreateFolder ist, dass das Skript in der CA meiner Meinung nach dann nicht auf Eigenschaften zugreifen kann. Wie kann ich dann den Verzeichnisnamen ermitteln?

Anbei das Skript, das in der benutzerdefinierten Aktion aufgerufen wird:

Function SetFolderSettingsFolderAttributes()
On Error Resume Next

Dim objFSO, objFolder
Dim strFolder : strFolder = ""

Set objFSO = CreateObject("Scripting.FileSystemObject")
strFolder = Session.Property("FolderSettingsFolder")
If Len(strFolder) <> 0 Then
If objFSO.FolderExists(strFolder) Then
Set objFolder = objFSO.GetFolder(strFolder)
objFolder.Attributes = objFolder.Attributes _
And Not (8+16+64+128+256+1024+2048) _
Or (1+2+4)
End If
End If

Set objFolder = Nothing
Set objFSO = Nothing

If Err.Number <> 0 Then
' Dim objRecord
' Set objRecord = Session.Installer.CreateRecord(0)
' objRecord.StringData(0) = Err.Description
' Session.Message &H01000000, objRecord
SetFolderSettingsFolderAttributes = 3
Else
SetFolderSettingsFolderAttributes = 1
End If
End Function


akerl

akerl
  • Full Members
  • 104 posts

Posted 02 November 2005 - 16:07

Custom Actions vom Typ Deferred können nicht auf die aktuelle Installationssession zugreifen, da diese aus der Executing Engine ausgeführt werden. Die Executing Engine hat lediglich Zugriff auf das Installationsskript. Es ist somit erforderlich den Namen des Verzeichnisses in das Skript zu übertragen, wozu eine CA vom Typ 51 verwendet werden kann.
Erstellen Sie also eine CA vom Typ 51 und referenzieren die Deferred CA in der der Spalte Source. Ist Ihre Aktion in der Spalte Action bspl. mit "TEST" bezeichnet, so übertragen Sie diese Bezeichnung in die Spalte Source der CA vom Typ 51. In der Tabelle InstallExecuteSequence ordnen Sie diese Aktion direkt vor Ihrer an.
Siehe auch: http://msdn.microsof...tom_actions.asp

- Andreas Kerl

Andreas Kerl

Inside Windows Installer 4.5
ISBN 3-86645-431-7


DrHVoss

DrHVoss
  • Members
  • 6 posts

Posted 04 November 2005 - 19:17

Sehr geehrter Herr Klein,

Vielen Dank für Ihre Antwort und nochmals vielen Dank für Ihr tolles Buch über den Windows Installer 3.1.

Ich habe das Problem gelöst und hier das Ergebnis für die digitale Nachwelt:

CODE

   <CustomAction Id="SETFOLDERATTRIBUTES" Return="check" Execute="deferred" Impersonate="no" BinaryKey="SKMCABkp" VBScriptCall="SetFolderAttributes" />
   <CustomAction Id="SetFolderName" Return="check" Property="SETFOLDERATTRIBUTES" Value="[FolderSettingsFolder]|7--|--[INSTALLDIR]|4" />
...
   <InstallExecuteSequence>
     <Custom Action="SetFolderName" After="InstallFiles"><![CDATA[NOT Installed]]></Custom>
     <Custom Action="SETFOLDERATTRIBUTES" After="SetFolderName"><![CDATA[NOT Installed]]></Custom>
   </InstallExecuteSequence>
...
   <Binary Id="SKMCABkp" src="Binaries\SKMCABkp.vbs" />


Der Inhalt der VBScript-Datei sieht folgendermaßen aus:

CODE

Option Explicit

Function SetFolderAttributes()
On Error Resume Next

Dim objFSO, objFolder
Dim strCustomData : strCustomData = ""
Dim strEntry
Dim strFolder : strFolder = ""
Dim arrFolders, arrFolder

Set objFSO = CreateObject("Scripting.FileSystemObject")
strCustomData = Session.Property("CustomActionData")
If Len(strCustomData) <> 0 Then
 arrFolders = Split(strCustomData, "--|--")
 For Each strEntry In arrFolders
  If Len(strEntry) <> 0 Then
   arrFolder = Split(strEntry, "|")
   If UBound(arrFolder) > 0 Then
    strFolder = arrFolder(0)
    If Len(strFolder) <> 0 Then
     If objFSO.FolderExists(strFolder) Then
      Set objFolder = objFSO.GetFolder(strFolder)
      objFolder.Attributes = objFolder.Attributes _
                             And Not (8+16+64+128+256+1024+2048) _
                             Or CInt(arrFolder(1))
     End If
    End If
   End If
  End If
 Next
End If

Set objFolder = Nothing
Set objFSO = Nothing

If Err.Number <> 0 Then
 SetFolderAttributes = 3
Else
 SetFolderAttributes = 1
End If
End Function


Der Trick ist die Sitzungseigenschaft CustomActionData und die Übergabe der Daten in Form von Verzeichnisname|Verzeichnisattribute--|--....

akerl

akerl
  • Full Members
  • 104 posts

Posted 06 November 2005 - 10:18

Es freut mich dass Ihnen das Buch gefällt und auch dass Sie das Problem lösen konnten. Ich habe gesehen, dass Sie Ihre Pakete mit WIX erstellen. Sie finden dazu einen freien Artikel auf www.dotnetpro.de.

- Andreas Kerl

Andreas Kerl

Inside Windows Installer 4.5
ISBN 3-86645-431-7


DrHVoss

DrHVoss
  • Members
  • 6 posts

Posted 11 November 2005 - 20:27

Sehr geehrter Herr Klein,

vielen Dank für Ihren Hinweis auf den entsprechenden Artikel über WiX in der Zeitschrift dotnetpro. Natürlich kenne ich diesen Artikel, da ich erstens diese Zeitschrift abonniert habe und zweitens kaum Artikel über WiX im Internet zur Verfügung stehen, was ich sehr Schade finde, da die Idee, die hinter WiX steht, einfach genial ist.

Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 12 November 2005 - 18:10

Kleiner Hinweis am Rande: Der Autor heisst Andreas KERL, nicht KLEIN.