Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для AZJIO

Старожил


Сообщения: 254
Благодарности: 126

Профиль | Отправить PM | Цитировать


Вот интересная WIMGAPI UDF. С помощью неё можно даже без EXE-файлов вызывать функции прямо из wimgapi.dll. Хотя с точки зрения интерфейса командной строки кажется более надёжней, так как внутренее обращение к wimgapi.dll через imagex.exe более нативное (выделение памяти, формат параметров и т.д.).

Код: Выделить весь код
#include <ComboConstants.au3>
#include <WindowsConstants.au3>
#include <WimConstants.au3>
#include <wimgapi.au3>

$aResult = _WIM_Startup() ; Открывает wimgapi.dll
If @error Then Exit MsgBox(0, 'Сообщение', 'Ошибка старта wimgapi.dll')

$sPath = 'F:\sources\install.wim'
$sWimList = _Get_WimLabel($sPath)
If @error Then Exit MsgBox(0, "Ошибка", 'Не найдена метка wim-файла.' & @LF & 'Без метки извлечь wim-файл невозможно.')

$hGui = GUICreate('My Program', 250, 260)
$Def_Metka = StringLeft($sWimList, StringInStr($sWimList & '|', '|') - 1)
$iCombo = GUICtrlCreateCombo("", 10, 10, 190, 24, $CBS_DROPDOWNLIST + $WS_VSCROLL)
GUICtrlSetData(-1, $sWimList, $Def_Metka)
GUISetState()
While 1
    Switch GUIGetMsg()
        Case -3
            _WIM_Shutdown() ; закрывает открытый дескриптор wimgapi.dll
            Exit
    EndSwitch
WEnd

Func _Get_WimLabel($sWimFile)
    Local $aLabel, $aXML, $s_WIM_List
    If Not FileExists($sWimFile) Then Return SetError(1, 0, '') ; Файл не существует
    ; Открыть существующий с доступом чтения
    $hWim = _WIM_CreateFile($sWimFile, $WIM_GENERIC_READ, $WIM_OPEN_EXISTING, 0, 0, 0)
    If Not $hWim Then Return SetError(2, 0, '') ; Не удалось открыть дескриптор

    $aXML = _WIM_GetImageInformation($hWim) ; Чтение информации
    _WIM_CloseHandle($hWim) ; Закрыаем открытый дескриптор

    $aLabel = StringRegExp($aXML[1], "(?m)(?<=<NAME>)(.*?)(?=</NAME>)", 3) ; Вытаскиваем имя метки в тегах <NAME>
    If @error Then
        Return SetError(3, 0, '')
    Else
        $s_WIM_List = ''
        For $i = 0 To UBound($aLabel) - 1
            $s_WIM_List &= $aLabel[$i] & '|'
        Next
        Return SetError(0, 0, StringTrimRight($s_WIM_List, 1))
    EndIf
EndFunc   ;==>_Get_WimLabel

Последний раз редактировалось AZJIO, 12-08-2013 в 13:13.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:38, 12-08-2013 | #3