2010-01-19 3 views
1

В WiX У меня есть vbScript для использования в пользовательском действии, которое вернет ListItems сетевых принтеров. Я хочу использовать эти ListItems для заполнения ComboBox во время установки, потому что я не буду знать имена принтеров в системе пользователей до начала установки.WiX Dynamicically Populated ComboBox

Это vbScript. В настоящее время он выводит на текстовый файл, ожидая, как работать с ним, чтобы ответить на мой вопрос.

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 

И это выход:

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

Я надеюсь, чтобы иметь возможность использовать этот вывод, как ListItems для моего 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> 

Если есть лучший способ или я приближаюсь все это неправильно (я продолжаю пытаться думать, как разработчик), пожалуйста, не стесняйтесь исправлять меня. Я толстый skinned ... :)

ответ

3

Как я подозревал в конце моего оригинального сообщения, был другой способ, и я ошибся. По крайней мере, несколько. Будучи новичком в WiX, я не принимал во внимание тот факт, что значения должны быть добавлены в базу данных. Учитывая, что я не сталкивался с этим еще в своем опыте, мне пришлось узнать что-то новое.

Так вот что я сделал, чтобы получить значения для отображения в моем ComboBox:

1.) Скрипт выше был изменен, чтобы использовать коллекцию, чтобы отправить соответствующие значения в таблице базы данных с именем ComboBox.

2.) Используя Orca, я добавил таблицу ComboBox. BTW он просто хранит информацию для ListItems, используемую в, дождитесь ее ... ComboBoxes.


3.) Добавлено соответствующее пользовательское действие.


4.) Вызывается как раз перед загрузкой формы.

Вот 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 

Добавить Binary запись:

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

добавить настраиваемое действие:

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

Добавьте вызов в пользовательских действий в InstallUISequence и AdminUISequence:

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

Это он ... Теперь, конечно, сценарий необходимо очистить, чтобы генерировать более эффективную информацию журнала, а также нуждается в улучшенной (некоторой) обработке ошибок, но она определенно работает.

Я надеюсь, что это поможет другим ...

Смежные вопросы