» Считываем данные из консольного приложения в ListView

K.A.V.
www.oszone.net
22.02.2010
Автор: K.A.V.
Последнее обновление: 17.05.2014

Внимание!
Данный пример кода требует наличие установленного у вас плагина ExecDos

INI файл
; Ini file generated by the HM NIS Edit IO designer.
[Settings]
NumFields=3

[Field 1]
Type=Label
Text=Считываем данные из консольного приложения
Left=2
Right=296
Top=0
Bottom=10
FontName=Verdana
FontHeight=10
FontBold=1

[Field 2]
Type=ListView
Text=ListView
Flags=REPORT_VIEW
Left=2
Right=297
Top=13
Bottom=121

[Field 3]
Type=Button
Text=Получить информацию о системе
Left=1
Right=297
Top=124
Bottom=136
NOTIFY=ONCLICK

NSIS код

!include "MUI.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"
!include "CommCtrl.nsh"
!include "FileFunc.nsh"

Page custom MyDialog MyDialog_Leave "" ; Функция показа диалога
!insertmacro MUI_PAGE_DIRECTORY
Page instfiles
!insertmacro MUI_LANGUAGE "Russian"

Caption "Получение информации из консольного приложения"
OutFile "Project.exe"


Function MyDialog
  InitPluginsDir
  File /oname=$PLUGINSDIR\Project.ini "Project.ini"

        InstallOptionsEx::initDialog /NOUNLOAD "$PLUGINSDIR\Project.ini"

  Var /global HWND
  ReadINIStr $HWND "$PLUGINSDIR\Project.ini" "Field 2" "HWND"
  SendMessage $HWND ${LVM_SETEXTENDEDLISTVIEWSTYLE} "${LVS_EX_FULLROWSELECT}" "${LVS_EX_FULLROWSELECT}"
  ${NSD_AddStyle} $HWND "${LVS_NOCOLUMNHEADER}"

        InstallOptionsEx::show
FunctionEnd


Function MyDialog_Leave
  ReadINIStr $0 "$PLUGINSDIR\Project.ini" "Settings" "State"

  StrCmp $0 0 Button_NEXT_Clicked
  StrCmp $0 3 getSystemInfoButton

  abort ; прекращаем проверку, т.к. взаимодействующих элементов в нашей странички больше нет

getSystemInfoButton:
 ReadINIStr $R2 "$PLUGINSDIR\Project.ini" "Field 1" "HWND"
 SendMessage $R2 ${WM_SETTEXT} "0" "STR:Получение информации о системе..."
 call getSystemInfo
 SendMessage $R2 ${WM_SETTEXT} "0" "STR:Информация о системе получена!"
abort

Button_NEXT_Clicked:
FunctionEnd




Function getSystemInfo
Push "ExecDos::End" # Add a marker for the loop to test for.
ExecDos::exec /NOUNLOAD /TOSTACK "systeminfo" "" ""
Pop $0 # return value
StrCmp $0 0 0 Failed
## Loop through stack.
Loop:
    Pop $1
    StrCmp $1 "ExecDos::End" ExitLoop
 System::Call "user32::OemToChar(tr1, t.r1)"
 SendMessage $R2 ${WM_SETTEXT} "0" "STR:$1"
 SendMessage $HWND ${LVM_GETITEMCOUNT} "" "" $R1
 ${NSD_LV_InsertItem} $HWND "0" "$1"
 SendMessage $HWND ${LVM_ENSUREVISIBLE} $R1 1
 SendMessage $HWND ${LVM_SETCOLUMNWIDTH} "0" "${LVSCW_AUTOSIZE}"
    Goto Loop
ExitLoop:
Return # Exit Function / Section
Failed:
MessageBox MB_OK "Exit code $0"
Return # Exit Function / Section
FunctionEnd


Section -post
SetAutoClose false
SectionEnd