2010-01-19 4 views
1

Dans WiX, j'ai un vbScript à utiliser dans une action personnalisée qui retournera ListItems des imprimantes réseau. Je veux utiliser ces ListItems pour remplir le ComboBox à l'heure d'installation parce que je ne connaîtrai pas les noms d'imprimantes sur le système d'utilisateurs avant de commencer l'installation.WiX ComboBox à remplissage dynamique

Voici le vbScript. Il sort actuellement dans un fichier texte en attendant comment travailler avec lui pour répondre à ma question.

Const ForWriting = 2 

Set objNetwork = CreateObject("Wscript.Network") 

strName = objNetwork.UserName 
strDomain = objNetwork.UserDomain 
strUser = strDomain & "\" & strName 

strText = "" 

strComputer = "." 

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 

Set colPrinters = objWMIService.ExecQuery _ 
    ("Select * From Win32_Printer Where Local = FALSE") 

For Each objPrinter in colPrinters 
    strText = strText & "<ListItem Text=""" & objPrinter.Name &""" Value="""& objPrinter.Name &"""/>" & vbcrlf 
Next 

Set objFSO = CreateObject("Scripting.FileSystemObject") 

Set objFile = objFSO.CreateTextFile _ 
    ("C:\Scripts\Printers.txt", ForWriting, True) 

objFile.Write strText 

objFile.Close 

Et ceci est la sortie:

<ListItem Text="\\xfiles\Canon iR3030 PCL6" Value="\\xfiles\Canon iR3030 PCL6"/> 
<ListItem Text="\\xfiles\HP2110" Value="\\xfiles\HP2110"/> 

J'espère pouvoir utiliser cette sortie comme ListItems pour mon ComboBox.

<Control Type="ComboBox" Property="cboPrinters_Prop" Id="cboPrinters" Width="206" Height="16" X="19" Y="139" ComboList="yes"> 
    <ComboBox Property="cboPrinters_Prop"> 
     <ListItem Text="" Value=""/> 
    </ComboBox> 
</Control> 

S'il y a une meilleure façon ou j'approche tout faux (je continue à essayer de penser comme un développeur) s'il vous plaît ne hésitez pas à me corriger. Je suis épaisse peau ... :)

Répondre

3

Comme je me doutais vers la fin de mon message original, il y avait une manière différente et je m'y prenais mal. Au moins un peu. Étant nouveau à WiX je n'ai pas pris en considération le fait que les valeurs devraient être ajoutées à la base de données. Étant donné que je n'avais pas encore rencontré cela dans mes expériences, j'ai appris quelque chose de nouveau.

Alors, voici ce que je l'ai fait pour obtenir les valeurs à afficher dans mon ComboBox:

1.) Script ci-dessus a été modifié pour utiliser la collection pour envoyer les valeurs appropriées à la table de base de données nommée ComboBox.


2.) En utilisant Orca j'ai ajouté la table ComboBox. BTW il contient juste les informations pour ListItems utilisés dans, attendez-le ... ComboBoxes.


3.) Ajout de l'action personnalisée appropriée.


4.) Appelé juste avant le chargement du formulaire.

est ici le vb script:

Const ERROR_SUCCESS = 0 
Const ERROR_INSTALL_FAILURE = 1603 
Const msiViewModifyInsertTemporary = 7 

Function LogInfo(msg) 
    Dim rec 
    Set rec = Session.Installer.CreateRecord(1) 
    rec.StringData(0) = msg 
    LogInfo = Session.Message(&H04000000, rec) 
End Function 



Function GetNetworkPrinters() 
Dim oView, oReccombo 
Dim r 

LogInfo "INSIDE GetNetworkPrinters" 
Set objNetwork = CreateObject("Wscript.Network") 

strName = objNetwork.UserName 
strDomain = objNetwork.UserDomain 
strUser = strDomain & "\" & strName 

strText = "" 

strComputer = "." 

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 

Set colPrinters = objWMIService.ExecQuery _ 
    ("Select * From Win32_Printer Where Local = FALSE") 


Set oView = Session.Database.OpenView("SELECT * FROM `ComboBox`") 
oView.Execute 
r = 1 
For Each objPrinter in colPrinters 
r = r + 1 

LogInfo "THE PRINTER NAME IS " & objPrinter.Name 

Set oReccombo = Session.Installer.CreateRecord(4) 
oReccombo.StringData(1) = "cboPrinters_Prop" 
oReccombo.IntegerData(2) = r 
oReccombo.StringData(3) = objPrinter.Name 
oReccombo.StringData(4) = objPrinter.Name 
LogInfo "Made it to the call to insert the record" 
oView.Modify msiViewModifyInsertTemporary, oReccombo 

Next 
oView.Close 

GetNetworkPrinters = ERROR_SUCCESS 

Set oView = Nothing 
End Function 

Ajouter une entrée binaire:

<Binary Id="GetNetworkPrinters" SourceFile="*Enter the full path to the script here* \GetNetworkPrinters.vbs" /> 

Ajouter l'action personnalisée:

<CustomAction Id="AddPrintersToComboBox" BinaryKey="GetNetworkPrinters" VBScriptCall="GetNetworkPrinters" Execute="immediate" Return="check" HideTarget="no" Impersonate="yes" /> 

Ajouter l'appel à l'action personnalisée dans le InstallUISequence et la séquence AdminUIS:

<Custom Action="AddPrintersToComboBox" Before="MaintenanceForm"></Custom> 

Voilà ... Maintenant, le script doit être nettoyé pour générer de meilleures informations de log et nécessite également une meilleure gestion des erreurs (certaines), mais cela fonctionne vraiment. Je souhaite que cela aide les autres ...