AkulaBig
|
Posted: Fri May 08, 2026 16:27 Post subject: |
|
|
| Orion9 wrote: | | Причем это характерно только для 64-битной версии, в 32-битной такого нет. |
Ах тыж, блин. А я столько времени потратил на попытку сделать код в Ауторан. В этом и есть вся причина. Попробовал в х32. Работает не хуже, чем на au3. Ну тогда вообще нет никакого смысла что-то городить. Понятно, что пока сансей не исправит глюк, про Ауторан можно забыть. Вот отлично работающий в х32 код, без всяких -stay_open:
| Code: |
Func ET1(FileName, FieldIndex, UnitIndex)
Local pipe
If StrPos(FileGetAttr(FileName), "D") Then Return
ProcessExecGetOutput pipe %util_ET% '-T -m -q -q -Title "%FileName%"'
If Not StrPos(pipe, "Error:") Then Return FixCPET(pipe)
EndFunc
Func ET(FileName, FieldIndex, UnitIndex)
If StrPos(FileGetAttr(FileName), "D") Then Return
Static a = List(), u = List()
Local ansi, utf8, wrong = Chr(0xFFFD)
Local param = " -f -s3 -m -q -q -Title "
ClipPut("")
ShellExec("~/SW_HIDE /WAIT", COMSPEC, '/c ' & util_ET & param & '"' & FileName & '"' & ' | clip')
ansi = ClipGet()
ClipPut("")
If Not StrPos(pipe, "Error:") Then Return FixCPET(pipe)
EndFunc
|
Единственное, огромная просьба к вам. Сами понимаете, в буфер приходит OEM. То-есть FixCPET(pipe) сначала надо из 866 перекодировать в 1251, а затем в утф. На au3 я это реализовал. Ниже увидите в коде. Можете помочь сделать это в Ауторан? Хочется закончить этот код. Пусть он будет не рабочий пока, но вдруг пригодится. Конечно я пока не буду писать код разделения значений полей. Но хочу чтобы база была сделана.
| Orion9 wrote: | | Изменит однозначно. |
На данный момент я решил отказаться от реализации этой идеи. Очень мне не нравится, что все держится на wait. Мне кажется тогда надо ожидание выполнять не через временные интервалы, а через сравнение значений. Иначе это какая-то чудовищная потери скорости. Ладно, решу, тестить или не тестить.
| Orion9 wrote: | | Но я бы vbs не скидывал со счетов. |
Ха, ха, ха. А я его не скинул со счетов. Я вам намекал на то, что такое накодировал. Но вы мою последнюю сборку не смотрели. Я просто хотел чтобы вы в работе посмотрели, да и код не по теме. Но тогда выкладываю здесь под катом:
 Hidden text
| Code: |
#NoTrayIcon
#include <Encoding.au3>
Local $program, $param, $filename, $iPID, $sOutput, $sUTF8_String, $aArray, $content, $content1, $content2, $content3, $content4, $content5, $content6, $content7, $content8, $content9, $content10, $content11, $content12, $content13, $content14, $content15, $content16, $content17, $content18, $content19, $content20, $content21, $content22, $content23, $content24, $content25, $content26, $content27, $content28, $content29, $content30, $content31
If StringInStr(FileGetAttrib($filename), "D") Then Exit
$program = EnvGet("util_ET")
$param = " -f -s3 -m -q -q -Title -Author -Subject -Description -Creator -Year -Company -FileCreateDate -FileModifyDate -LastModifiedBy -Paragraphs -Document-statisticParagraph-count -Lines -Pages -PageCount -Document-statisticPage-count -Words -Document-statisticWord-count -Characters -Document-statisticCharacter-count -Document-statisticTable-count -Document-statisticCell-count -Software -Application -CreatorTool -AppVersion -PDFVersion -DjVuVersion -Producer -Publisher -Generator -Security -DocSecurity -Encryption -Comments "
Local $VbsObj = ObjCreate("ScriptControl")
If @error Or Not FileExists("c:\Windows\System32\vbscript.dll") Then
$iPID = Run(@ComSpec & " /C " & chr(34) & chr(34) & $program & chr(34) & $param & chr(34) & $filename & chr(34), "", @SW_HIDE, 0x2)
While 1
$sOutput &= StdoutRead($iPID)
If @error Then ExitLoop
WEnd
Else
$VbsObj.Language = "VBScript"
Local $Code = ""
$Code &= 'On Error Resume Next' & @LF
$Code &= 'Function ExifTool(program, param, filename)' & @LF
$Code &= 'Dim objShell : Set objShell = CreateObject("WScript.Shell")' & @LF
$Code &= 'objShell.Run "%COMSPEC% /c " & chr(34) & chr(34) & program & chr(34) & param & chr(34) & filename & chr(34) & " | clip" & chr(34), 0, True' & @LF
$Code &= 'strOutput = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")' & @LF
$Code &= 'With CreateObject("ADODB.Stream")' & @LF
$Code &= '.Charset = "cp866"' & @LF
$Code &= '.Open' & @LF
$Code &= '.WriteText strOutput' & @LF
$Code &= '.Position = 0' & @LF
$Code &= '.Charset = "Windows-1251"' & @LF
$Code &= 'ExifTool = .ReadText' & @LF
$Code &= 'End With' & @LF
$Code &= 'Set objShell = Nothing' & @LF
$Code &= 'Set objWshExec = Nothing' & @LF
$Code &= 'End Function' & @LF
$VbsObj.AddCode($Code)
$sOutput = $VbsObj.Run("ExifTool", $program, $param, $filename)
EndIf
; MsgBox(1, "", $sOutput)
$sOutput = StringReplace($sOutput, "-", " ")
$aArray = StringSplit($sOutput, @LF)
$sUTF8_String = _Encoding_IsUTF8Format($sOutput)
If $sUTF8_String Then
$content = BinaryToString($aArray[1], 4)
Else
$content = BinaryToString($aArray[1], 1)
EndIf
ConsoleWrite($content)
|
Из кода удалил поля по 34, чтобы не захломлять код.
Обратите внимание, не забыл я про vbs. Теперь он работает у меня в au3 Правда это только код для красоты. Надо либо au3 x32 использовать. Либо перенаправить на system32. Ну или использовать ТС х32. Известная проблема х64 систем. Ну и я про перекодировку. Как видите, я читаю из буфера 866 в 1251, а далее в утф. Вот хотелось-бы реализовать это в Ауторан. Если найдете минутку, помогите, пожалуйста.
Совсем забыл. Я-же добавил в WinScriptsAdv количество полей. А то 21 поле совсем мало. Сделал 40 вроде. На оф. форуме Гислера ссылку дал. |
|