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
|