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

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

Googler


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

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


biork
Цитата:
скрипт ни как не может найти секцию
Файл получил, все ясно - у тебя INF-файлы из локализованной Windows, а значит в Unicode-кодировке... я подправил пару функций для поддержки файлов в юникоде. Добавь в конец скрипта прилагаемый текст функций и замени по тексту FileReadToArray и FileWriteFromArray на _FileReadUnicodeToArray и _FileWriteUnicodeFromArray соответственно:
Код: Выделить весь код
Func _FileReadUnicodeToArray ($sFilePath, ByRef $aArray)
    Local $hFile = FileOpen ($sFilePath, 0)
    If $hFile = -1 Then
        SetError (1)
        Return 0
    EndIf
    Local $uData = FileRead ($hFile, FileGetSize($sFilePath))
    Local $sData = _WCStrToString ($uData)
    If @error Then
        SetError (2)
        Return 0
    EndIf
    $aArray = StringSplit (StringStripCR ($sData), @LF)
    FileClose ($hFile)
    Return 1
EndFunc

Func _FileWriteUnicodeFromArray ($sFilePath, ByRef $a_Array, $i_Base = 0, $i_UBound = 0)
    Local $hFile
    If Not IsArray ($a_Array) Then
        SetError (2)
        Return 0
    EndIf
    Local $last = UBound ($a_Array) - 1
    If $i_UBound < 1 Or $i_UBound > $last Then $i_UBound = $last
    If $i_Base < 0 Or $i_Base > $last Then $i_Base = 0
    $hFile = FileOpen ($sFilePath, 2)
    If $hFile = -1 Then
        SetError (1)
        Return 0
    EndIf
    FileWrite ($hFile, _StringToWCStr ($a_Array [$i_Base], 1))
    For $x = $i_Base +1 To $i_UBound
        $a_Array [$x] = @CRLF & $a_Array [$x]
        FileWrite ($hFile, _StringToWCStr ($a_Array [$x]))
    Next
    FileClose($hFile)
    Return 1
EndFunc

Func _StringToWCStr (ByRef $sString, $mark = 0)
    Local $len = StringLen ($sString), $wcl= BitShift ($len, -1)
    Local $buf, $ptr
    If $len =0 Then
        If $mark Then Return Chr(0xFF) & Chr(0xFE)
        Return ''
    EndIf
    If $mark Then
        $buf = DllStructCreate ("byte[" & $wcl +2 & "]")
        DllStructSetData ($buf, 1, Chr(0xFF) & Chr(0xFE))
        $ptr = DllStructGetPtr ($buf) +2
    Else
        $buf = DllStructCreate ("byte[" & $wcl & "]")
        $ptr = DllStructGetPtr ($buf)
    EndIf
    Local $ret = DllCall ("Kernel32.dll", "int", "MultiByteToWideChar", _
        "int", 0, _
        "int", 0, _
        "str", $sString, _
        "int", $len,  _
        "ptr", $ptr,  _
        "int", $wcl )
    If $ret [0] Then
        Return DllStructGetData ($buf, 1)
    Else
        $ret = DllCall ("Kernel32.dll", "int", "GetLastError")
        SetError ($ret [0])
    EndIf
EndFunc

Func _WCStrToString (ByRef $wcString)
    Local $wcl = StringLen ($wcString), $len = BitShift ($wcl, 1)
    If $wcl =0 Then Return ''
    Local $out = DllStructCreate ("char[" & $len & "]")
    Local $buf = DllStructCreate ("byte[" & $wcl  & "]")
    Local $ptr = DllStructGetPtr ($buf)
    DllStructSetData ($buf, 1, $wcString)
    If DllStructGetData ($buf, 1, 1) =-1 AND DllStructGetData ($buf, 1, 2) =-2 Then
        $ptr +=2
        $len -=1
    EndIf
    Local $ret = DllCall ("Kernel32.dll", "int", "WideCharToMultiByte", _
        "int", 0, _
        "int", 0, _
        "ptr", $ptr, _
        "int", $len, _
        "ptr", DllStructGetPtr ($out), _
        "int", $len, _
        "int", 0, _
        "int", 0 )
       If $ret [0] Then
        Return DllStructGetData ($out, 1)
    Else
        $ret = DllCall ("Kernel32.dll", "int", "GetLastError")
        SetError ($ret [0])
    EndIf
EndFunc

Последний раз редактировалось amel27, 11-12-2006 в 03:33.

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

Отправлено: 19:40, 09-12-2006 | #36