WiX динамически заполненный ComboBox - PullRequest
1 голос
/ 19 января 2010

В WiX у меня есть vbScript для использования в настраиваемом действии, которое возвращает ListItems сетевых принтеров.Я хочу использовать эти ListItems для заполнения 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>

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

1 Ответ

3 голосов
/ 20 января 2010

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

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

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


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


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


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

Вот сценарий vb:

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 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>

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...