Sign in to follow this  
Followers 0
moocan2112

AutoIt3.exe ended.rc:-1073741819 (Trying OEM To Ansi)

6 posts in this topic

Dear Community,

I'm trying to catch the output from a console soft witch is verbose using StdoutRead. All Is working fine.

But I need to convert characters from OEM To Ansi because there is many and many french accentuated characters.

I'm on a Windows 7 Professional x64.

I have made so many search about OemToAnsi

So here is a piece of code (Which I have found on your site) that I use to test ( and reproduce my error) and include a simple "DIR C: /S /O:N" which return a lot of output

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GuiEdit.au3>
#include <WinAPIMisc.au3>


Local $line

$Parent = GUICreate  ("OemToCharW Test", 520, 260, -1, -1)
$Logbox = GUICtrlCreateEdit('', 10, 10, 500, 200); , BitOR($ES_READONLY, $WS_VSCROLL))
_GUICtrlEdit_SetLimitText($logbox, -1)
;$Logbox = _GUICtrlEdit_Create($Parent, "This is a test" & @CRLF & "Another Line", 10, 10, 500, 200)
$Button = GuiCtrlCreateButton("Run", 10, 220, 80, 20)
GuiSetState ()


While 1
    Dim $GUI_Msg = GuiGetMsg()
    Switch $GUI_Msg
        Case -3
            Exit
        Case -100 To 0
            ContinueLoop
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button
            _Check ()
    EndSwitch
Wend

Func _Check()
    GUICtrlSetData ($Button, "Stop")
    GUICtrlSetData($Logbox, "")

    ;Local $Pid = Run(@SystemDir & '\cmd /c "dir c:\ /s /O:N"', @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
;Local $Pid = Run(@SystemDir & '\cmd /c "dir c:\ /s /O:N"', @SystemDir, @SW_MAXIMIZE, $STDIN_CHILD + $STDOUT_CHILD)
    local $Pid = Run(@ComSpec & " /c " & "dir c:\ /S /O:N",@SystemDir,@SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
    MsgBox(0, "Pid", $Pid)
    While $Pid
        $msg = GUIGetMsg()
        Select
            Case $msg = $GUI_EVENT_CLOSE or $msg = $Button
                ProcessClose ($Pid)
                Exitloop
        EndSelect
        Dim $line = StdoutRead($Pid)
        If @error Then
            ExitLoop
        Else
            ;1st way
            ;Local $hDll = DllOpen("User32.dll")
            $ret = DllCall("User32.dll", "BOOL", "OemToChar", "str", $line, "str", "")
            If $ret[0] Then $line = $ret[2]

            ;view string len
            Local $linelen = StringLen($line)
            ConsoleWrite($line & @CRLF)
            ConsoleWrite("buffer: " & $linelen & @CRLF)

            ; 2nd test
            ;Local $linelen = StringLen($line)
            ;$ret = DllCall("user32.dll", "BOOL", "OemToCharBuff", "str", $line, "str", "", "DWORD", $linelen)
            ;$retour = $ret[2]
            ;$line = $retour

            ;GUICtrlSetData($Logbox, @LF, True)

            ;$line = OEM2ANSI($line)
            ;$line = _ChangePageCode($line,1)

            ; split string working but report output 5 minutes after process finished .. not realtime
            ;$aFolder = StringSplit($line, @CRLF, 3)
            ;ReDim $aFolder[UBound($aFolder) - 1]
            ;For $i = 0 To UBound($aFolder) - 1
            ;
            ;       $msg = GUIGetMsg()
            ;       Select
            ;           Case $msg = $GUI_EVENT_CLOSE or $msg = $Button
            ;               msgbox(0,"debug", $Pid)
            ;               ProcessClose($Pid)
            ;               MsgBox(0,"debug", @error)
            ;               Exitloop
            ;       EndSelect
            ;
            ;
            ;   ;$aFolder[$i] = _OEMToAnsi($aFolder[$i])
            ;   $aFolder[$i] = _WinAPI_OemToChar ($aFolder[$i])
            ;   _GUICtrlEdit_AppendText($Logbox, $aFolder[$i] & @CRLF)
            ;Next

            ;GUICtrlSetData($Logbox, $line, True)
            _GUICtrlEdit_AppendText($Logbox, $line)
            ;DllClose($ret)
        EndIf
    WEnd
    GUICtrlSetData ($Button, "Run")
EndFunc

Func _OEMToAnsi($sOEM)
    Local $a_AnsiFName = DllCall('user32.dll', 'Int', 'OemToChar', 'str', $sOEM, 'str', '')
    If @error = 0 Then $sAnsi = $a_AnsiFName[2]
    Return $sAnsi
EndFunc   ;==>_OEMToAnsi

Func _ChangePageCode($sString, $iPageCode)
    Local $objConv = ObjCreate("OlePrn.OleCvt")
    return $objConv.ToUnicode($sString,$iPageCode)
EndFunc


Func OEM2ANSI($aString)

 Local $OEM[256]

 $OEM[000]="00"
 $OEM[001]="01"
 $OEM[002]="02"
 $OEM[003]="03"
 $OEM[004]="04"
 $OEM[005]="05"
 $OEM[006]="06"
 $OEM[007]="07"
 $OEM[008]="08"
 $OEM[009]="09"
 $OEM[010]="0A"
 $OEM[011]="0B"
 $OEM[012]="0C"
 $OEM[013]="0D"
 $OEM[014]="0E"
 $OEM[015]="0F"
 $OEM[016]="10"
 $OEM[017]="11"
 $OEM[018]="12"
 $OEM[019]="13"
 $OEM[020]="14"
 $OEM[021]="15"
 $OEM[022]="16"
 $OEM[023]="17"
 $OEM[024]="18"
 $OEM[025]="19"
 $OEM[026]="1A"
 $OEM[027]="1B"
 $OEM[028]="1C"
 $OEM[029]="1D"
 $OEM[030]="1E"
 $OEM[031]="1F"
 $OEM[032]="20"
 $OEM[033]="21"
 $OEM[034]="22"
 $OEM[035]="23"
 $OEM[036]="24"
 $OEM[037]="25"
 $OEM[038]="26"
 $OEM[039]="27"
 $OEM[040]="28"
 $OEM[041]="29"
 $OEM[042]="2A"
 $OEM[043]="2B"
 $OEM[044]="2C"
 $OEM[045]="2D"
 $OEM[046]="2E"
 $OEM[047]="2F"
 $OEM[048]="30"
 $OEM[049]="31"
 $OEM[050]="32"
 $OEM[051]="33"
 $OEM[052]="34"
 $OEM[053]="35"
 $OEM[054]="36"
 $OEM[055]="37"
 $OEM[056]="38"
 $OEM[057]="39"
 $OEM[058]="3A"
 $OEM[059]="3B"
 $OEM[060]="3C"
 $OEM[061]="3D"
 $OEM[062]="3E"
 $OEM[063]="3F"
 $OEM[064]="40"
 $OEM[065]="41"
 $OEM[066]="42"
 $OEM[067]="43"
 $OEM[068]="44"
 $OEM[069]="45"
 $OEM[070]="46"
 $OEM[071]="47"
 $OEM[072]="48"
 $OEM[073]="49"
 $OEM[074]="4A"
 $OEM[075]="4B"
 $OEM[076]="4C"
 $OEM[077]="4D"
 $OEM[078]="4E"
 $OEM[079]="4F"
 $OEM[080]="50"
 $OEM[081]="51"
 $OEM[082]="52"
 $OEM[083]="53"
 $OEM[084]="54"
 $OEM[085]="55"
 $OEM[086]="56"
 $OEM[087]="57"
 $OEM[088]="58"
 $OEM[089]="59"
 $OEM[090]="5A"
 $OEM[091]="5B"
 $OEM[092]="5C"
 $OEM[093]="5D"
 $OEM[094]="5E"
 $OEM[095]="5F"
 $OEM[096]="60"
 $OEM[097]="61"
 $OEM[098]="62"
 $OEM[099]="63"
 $OEM[100]="64"
 $OEM[101]="65"
 $OEM[102]="66"
 $OEM[103]="67"
 $OEM[104]="68"
 $OEM[105]="69"
 $OEM[106]="6A"
 $OEM[107]="6B"
 $OEM[108]="6C"
 $OEM[109]="6D"
 $OEM[110]="6E"
 $OEM[111]="6F"
 $OEM[112]="70"
 $OEM[113]="71"
 $OEM[114]="72"
 $OEM[115]="73"
 $OEM[116]="74"
 $OEM[117]="75"
 $OEM[118]="76"
 $OEM[119]="77"
 $OEM[120]="78"
 $OEM[121]="79"
 $OEM[122]="7A"
 $OEM[123]="7B"
 $OEM[124]="7C"
 $OEM[125]="7D"
 $OEM[126]="7E"
 $OEM[127]="7F"
 $OEM[128]="C7"
 $OEM[129]="FC"
 $OEM[130]="E9"
 $OEM[131]="E2"
 $OEM[132]="E4"
 $OEM[133]="E0"
 $OEM[134]="E5"
 $OEM[135]="E7"
 $OEM[136]="EA"
 $OEM[137]="EB"
 $OEM[138]="E8"
 $OEM[139]="EF"
 $OEM[140]="EE"
 $OEM[141]="EC"
 $OEM[142]="C4"
 $OEM[143]="C5"
 $OEM[144]="C9"
 $OEM[145]="E6"
 $OEM[146]="C6"
 $OEM[147]="F4"
 $OEM[148]="F6"
 $OEM[149]="F2"
 $OEM[150]="FB"
 $OEM[151]="F9"
 $OEM[152]="FF"
 $OEM[153]="D6"
 $OEM[154]="DC"
 $OEM[155]="F8"
 $OEM[156]="A3"
 $OEM[157]="D8"
 $OEM[158]="D7"
 $OEM[159]="83"
 $OEM[160]="E1"
 $OEM[161]="ED"
 $OEM[162]="F3"
 $OEM[163]="FA"
 $OEM[164]="F1"
 $OEM[165]="D1"
 $OEM[166]="AA"
 $OEM[167]="BA"
 $OEM[168]="BF"
 $OEM[169]="AE"
 $OEM[170]="AC"
 $OEM[171]="BD"
 $OEM[172]="BC"
 $OEM[173]="A1"
 $OEM[174]="AB"
 $OEM[175]="BB"
 $OEM[176]="A6"
 $OEM[177]="A6"
 $OEM[178]="A6"
 $OEM[179]="A6"
 $OEM[180]="A6"
 $OEM[181]="C1"
 $OEM[182]="C2"
 $OEM[183]="C0"
 $OEM[184]="A9"
 $OEM[185]="A6"
 $OEM[186]="A6"
 $OEM[187]="2B"
 $OEM[188]="2B"
 $OEM[189]="A2"
 $OEM[190]="A5"
 $OEM[191]="2B"
 $OEM[192]="2B"
 $OEM[193]="2D"
 $OEM[194]="2D"
 $OEM[195]="2B"
 $OEM[196]="2D"
 $OEM[197]="2B"
 $OEM[198]="E3"
 $OEM[199]="C3"
 $OEM[200]="2B"
 $OEM[201]="2B"
 $OEM[202]="2D"
 $OEM[203]="2D"
 $OEM[204]="A6"
 $OEM[205]="2D"
 $OEM[206]="2B"
 $OEM[207]="A4"
 $OEM[208]="F0"
 $OEM[209]="D0"
 $OEM[210]="CA"
 $OEM[211]="CB"
 $OEM[212]="C8"
 $OEM[213]="69"
 $OEM[214]="CD"
 $OEM[215]="CE"
 $OEM[216]="CF"
 $OEM[217]="2B"
 $OEM[218]="2B"
 $OEM[219]="A6"
 $OEM[220]="5F"
 $OEM[221]="A6"
 $OEM[222]="CC"
 $OEM[223]="AF"
 $OEM[224]="D3"
 $OEM[225]="DF"
 $OEM[226]="D4"
 $OEM[227]="D2"
 $OEM[228]="F5"
 $OEM[229]="D5"
 $OEM[230]="B5"
 $OEM[231]="FE"
 $OEM[232]="DE"
 $OEM[233]="DA"
 $OEM[234]="DB"
 $OEM[235]="D9"
 $OEM[236]="FD"
 $OEM[237]="DD"
 $OEM[238]="AF"
 $OEM[239]="B4"
 $OEM[240]="AD"
 $OEM[241]="B1"
 $OEM[242]="3D"
 $OEM[243]="BE"
 $OEM[244]="B6"
 $OEM[245]="A7"
 $OEM[246]="F7"
 $OEM[247]="B8"
 $OEM[248]="B0"
 $OEM[249]="A8"
 $OEM[250]="B7"
 $OEM[251]="B9"
 $OEM[252]="B3"
 $OEM[253]="B2"
 $OEM[254]="A6"
 $OEM[255]="A0"

 $anArray = StringSplit($aString,"")
 $var = ""
 For $i = 1 to $anArray[0]
 $var = $var & Chr(dec($OEM[Asc($anArray[$i])]))
 Next
 return $var
 EndFunc

I have tryied so many think that I found on your site.

- Using function as OEMTOANSI or _ChangePageCode or  _OemToAnsi with a StringSplit is not realy "RealTime" as I have always an activity output 5+ minutes after the Dir C: /S /O:N has ended.

- Using a DllCall "DllCall("User32.dll", "BOOL", "OemToChar", "str", $line, "str", "")" or DllCall("user32.dll", "BOOL", "OemToCharBuff", "str", $line, "str", "", "DWORD", $linelen) => AutoIt crash with AutoIt3.exe ended.rc:-1073741819

I have tried using x86 and x64 build but nothing change.

All is working if I don't try to convert characters from OEM to Ansi.

Is there something that I don't do correctly ? Is there a limitation somewhere ?

If someone could help me or give me some advices.

Many thanks in advance

Kind Regards

 

 

Share this post


Link to post
Share on other sites



Look:

Local $OEM[256]
 $OEM[000]="00"
 $OEM[001]="01"
 $OEM[002]="02"
 $OEM[003]="03"
 $OEM[004]="04"
 $OEM[005]="05"
 $OEM[006]="06"
 $OEM[007]="07"
 $OEM[008]="08"
 $OEM[009]="09"
 $OEM[010]="0A"
 $OEM[011]="0B"
 $OEM[012]="0C"
 $OEM[013]="0D"
 $OEM[014]="0E"
 $OEM[015]="0F"
 $OEM[016]="10"
 $OEM[017]="11"
 $OEM[018]="12"
 $OEM[019]="13"
 $OEM[020]="14"
 $OEM[021]="15"
 $OEM[022]="16"
 $OEM[023]="17"
 $OEM[024]="18"
 $OEM[025]="19"
 $OEM[026]="1A"
 $OEM[027]="1B"
 $OEM[028]="1C"
 $OEM[029]="1D"
 $OEM[030]="1E"
 $OEM[031]="1F"
 $OEM[032]="20"
 $OEM[033]="21"
 $OEM[034]="22"
 $OEM[035]="23"
 $OEM[036]="24"
 $OEM[037]="25"
 $OEM[038]="26"
 $OEM[039]="27"
 $OEM[040]="28"
 $OEM[041]="29"
 $OEM[042]="2A"
 $OEM[043]="2B"
 $OEM[044]="2C"
 $OEM[045]="2D"
 $OEM[046]="2E"
 $OEM[047]="2F"
 $OEM[048]="30"
 $OEM[049]="31"
 $OEM[050]="32"
 $OEM[051]="33"
 $OEM[052]="34"
 $OEM[053]="35"
 $OEM[054]="36"
 $OEM[055]="37"
 $OEM[056]="38"
 $OEM[057]="39"
 $OEM[058]="3A"
 $OEM[059]="3B"
 $OEM[060]="3C"
 $OEM[061]="3D"
 $OEM[062]="3E"
 $OEM[063]="3F"
 $OEM[064]="40"
 $OEM[065]="41"
 $OEM[066]="42"
 $OEM[067]="43"
 $OEM[068]="44"
 $OEM[069]="45"
 $OEM[070]="46"
 $OEM[071]="47"
 $OEM[072]="48"
 $OEM[073]="49"
 $OEM[074]="4A"
 $OEM[075]="4B"
 $OEM[076]="4C"
 $OEM[077]="4D"
 $OEM[078]="4E"
 $OEM[079]="4F"
 $OEM[080]="50"
 $OEM[081]="51"
 $OEM[082]="52"
 $OEM[083]="53"
 $OEM[084]="54"
 $OEM[085]="55"
 $OEM[086]="56"
 $OEM[087]="57"
 $OEM[088]="58"
 $OEM[089]="59"
 $OEM[090]="5A"
 $OEM[091]="5B"
 $OEM[092]="5C"
 $OEM[093]="5D"
 $OEM[094]="5E"
 $OEM[095]="5F"
 $OEM[096]="60"
 $OEM[097]="61"
 $OEM[098]="62"
 $OEM[099]="63"
 $OEM[100]="64"
 $OEM[101]="65"
 $OEM[102]="66"
 $OEM[103]="67"
 $OEM[104]="68"
 $OEM[105]="69"
 $OEM[106]="6A"
 $OEM[107]="6B"
 $OEM[108]="6C"
 $OEM[109]="6D"
 $OEM[110]="6E"
 $OEM[111]="6F"
 $OEM[112]="70"
 $OEM[113]="71"
 $OEM[114]="72"
 $OEM[115]="73"
 $OEM[116]="74"
 $OEM[117]="75"
 $OEM[118]="76"
 $OEM[119]="77"
 $OEM[120]="78"
 $OEM[121]="79"
 $OEM[122]="7A"
 $OEM[123]="7B"
 $OEM[124]="7C"
 $OEM[125]="7D"
 $OEM[126]="7E"
 $OEM[127]="7F"
 $OEM[128]="C7"
 $OEM[129]="FC"
 $OEM[130]="E9"
 $OEM[131]="E2"
 $OEM[132]="E4"
 $OEM[133]="E0"
 $OEM[134]="E5"
 $OEM[135]="E7"
 $OEM[136]="EA"
 $OEM[137]="EB"
 $OEM[138]="E8"
 $OEM[139]="EF"
 $OEM[140]="EE"
 $OEM[141]="EC"
 $OEM[142]="C4"
 $OEM[143]="C5"
 $OEM[144]="C9"
 $OEM[145]="E6"
 $OEM[146]="C6"
 $OEM[147]="F4"
 $OEM[148]="F6"
 $OEM[149]="F2"
 $OEM[150]="FB"
 $OEM[151]="F9"
 $OEM[152]="FF"
 $OEM[153]="D6"
 $OEM[154]="DC"
 $OEM[155]="F8"
 $OEM[156]="A3"
 $OEM[157]="D8"
 $OEM[158]="D7"
 $OEM[159]="83"
 $OEM[160]="E1"
 $OEM[161]="ED"
 $OEM[162]="F3"
 $OEM[163]="FA"
 $OEM[164]="F1"
 $OEM[165]="D1"
 $OEM[166]="AA"
 $OEM[167]="BA"
 $OEM[168]="BF"
 $OEM[169]="AE"
 $OEM[170]="AC"
 $OEM[171]="BD"
 $OEM[172]="BC"
 $OEM[173]="A1"
 $OEM[174]="AB"
 $OEM[175]="BB"
 $OEM[176]="A6"
 $OEM[177]="A6"
 $OEM[178]="A6"
 $OEM[179]="A6"
 $OEM[180]="A6"
 $OEM[181]="C1"
 $OEM[182]="C2"
 $OEM[183]="C0"
 $OEM[184]="A9"
 $OEM[185]="A6"
 $OEM[186]="A6"
 $OEM[187]="2B"
 $OEM[188]="2B"
 $OEM[189]="A2"
 $OEM[190]="A5"
 $OEM[191]="2B"
 $OEM[192]="2B"
 $OEM[193]="2D"
 $OEM[194]="2D"
 $OEM[195]="2B"
 $OEM[196]="2D"
 $OEM[197]="2B"
 $OEM[198]="E3"
 $OEM[199]="C3"
 $OEM[200]="2B"
 $OEM[201]="2B"
 $OEM[202]="2D"
 $OEM[203]="2D"
 $OEM[204]="A6"
 $OEM[205]="2D"
 $OEM[206]="2B"
 $OEM[207]="A4"
 $OEM[208]="F0"
 $OEM[209]="D0"
 $OEM[210]="CA"
 $OEM[211]="CB"
 $OEM[212]="C8"
 $OEM[213]="69"
 $OEM[214]="CD"
 $OEM[215]="CE"
 $OEM[216]="CF"
 $OEM[217]="2B"
 $OEM[218]="2B"
 $OEM[219]="A6"
 $OEM[220]="5F"
 $OEM[221]="A6"
 $OEM[222]="CC"
 $OEM[223]="AF"
 $OEM[224]="D3"
 $OEM[225]="DF"
 $OEM[226]="D4"
 $OEM[227]="D2"
 $OEM[228]="F5"
 $OEM[229]="D5"
 $OEM[230]="B5"
 $OEM[231]="FE"
 $OEM[232]="DE"
 $OEM[233]="DA"
 $OEM[234]="DB"
 $OEM[235]="D9"
 $OEM[236]="FD"
 $OEM[237]="DD"
 $OEM[238]="AF"
 $OEM[239]="B4"
 $OEM[240]="AD"
 $OEM[241]="B1"
 $OEM[242]="3D"
 $OEM[243]="BE"
 $OEM[244]="B6"
 $OEM[245]="A7"
 $OEM[246]="F7"
 $OEM[247]="B8"
 $OEM[248]="B0"
 $OEM[249]="A8"
 $OEM[250]="B7"
 $OEM[251]="B9"
 $OEM[252]="B3"
 $OEM[253]="B2"
 $OEM[254]="A6"
 $OEM[255]="A0"

Local $bRet=0

For $i=0 To UBound($OEM)-1
 $bRet=DllCall("User32.dll","Bool","OemToCharW","wstr",$OEM[$i],"wstr","")
ConsoleWrite($OEM[$i] & " = " & $bRet[2] & @CRLF)
Next

Saludos

Share this post


Link to post
Share on other sites

Look:

Local $OEM[256]
 $OEM[000]="00"
 $OEM[001]="01"
 $OEM[002]="02"
 $OEM[003]="03"
 $OEM[004]="04"
 $OEM[005]="05"
 $OEM[006]="06"
 $OEM[007]="07"
 $OEM[008]="08"
 $OEM[009]="09"
 $OEM[010]="0A"
 $OEM[011]="0B"
 $OEM[012]="0C"
 $OEM[013]="0D"
 $OEM[014]="0E"
 $OEM[015]="0F"
 $OEM[016]="10"
 $OEM[017]="11"
 $OEM[018]="12"
 $OEM[019]="13"
 $OEM[020]="14"
 $OEM[021]="15"
 $OEM[022]="16"
 $OEM[023]="17"
 $OEM[024]="18"
 $OEM[025]="19"
 $OEM[026]="1A"
 $OEM[027]="1B"
 $OEM[028]="1C"
 $OEM[029]="1D"
 $OEM[030]="1E"
 $OEM[031]="1F"
 $OEM[032]="20"
 $OEM[033]="21"
 $OEM[034]="22"
 $OEM[035]="23"
 $OEM[036]="24"
 $OEM[037]="25"
 $OEM[038]="26"
 $OEM[039]="27"
 $OEM[040]="28"
 $OEM[041]="29"
 $OEM[042]="2A"
 $OEM[043]="2B"
 $OEM[044]="2C"
 $OEM[045]="2D"
 $OEM[046]="2E"
 $OEM[047]="2F"
 $OEM[048]="30"
 $OEM[049]="31"
 $OEM[050]="32"
 $OEM[051]="33"
 $OEM[052]="34"
 $OEM[053]="35"
 $OEM[054]="36"
 $OEM[055]="37"
 $OEM[056]="38"
 $OEM[057]="39"
 $OEM[058]="3A"
 $OEM[059]="3B"
 $OEM[060]="3C"
 $OEM[061]="3D"
 $OEM[062]="3E"
 $OEM[063]="3F"
 $OEM[064]="40"
 $OEM[065]="41"
 $OEM[066]="42"
 $OEM[067]="43"
 $OEM[068]="44"
 $OEM[069]="45"
 $OEM[070]="46"
 $OEM[071]="47"
 $OEM[072]="48"
 $OEM[073]="49"
 $OEM[074]="4A"
 $OEM[075]="4B"
 $OEM[076]="4C"
 $OEM[077]="4D"
 $OEM[078]="4E"
 $OEM[079]="4F"
 $OEM[080]="50"
 $OEM[081]="51"
 $OEM[082]="52"
 $OEM[083]="53"
 $OEM[084]="54"
 $OEM[085]="55"
 $OEM[086]="56"
 $OEM[087]="57"
 $OEM[088]="58"
 $OEM[089]="59"
 $OEM[090]="5A"
 $OEM[091]="5B"
 $OEM[092]="5C"
 $OEM[093]="5D"
 $OEM[094]="5E"
 $OEM[095]="5F"
 $OEM[096]="60"
 $OEM[097]="61"
 $OEM[098]="62"
 $OEM[099]="63"
 $OEM[100]="64"
 $OEM[101]="65"
 $OEM[102]="66"
 $OEM[103]="67"
 $OEM[104]="68"
 $OEM[105]="69"
 $OEM[106]="6A"
 $OEM[107]="6B"
 $OEM[108]="6C"
 $OEM[109]="6D"
 $OEM[110]="6E"
 $OEM[111]="6F"
 $OEM[112]="70"
 $OEM[113]="71"
 $OEM[114]="72"
 $OEM[115]="73"
 $OEM[116]="74"
 $OEM[117]="75"
 $OEM[118]="76"
 $OEM[119]="77"
 $OEM[120]="78"
 $OEM[121]="79"
 $OEM[122]="7A"
 $OEM[123]="7B"
 $OEM[124]="7C"
 $OEM[125]="7D"
 $OEM[126]="7E"
 $OEM[127]="7F"
 $OEM[128]="C7"
 $OEM[129]="FC"
 $OEM[130]="E9"
 $OEM[131]="E2"
 $OEM[132]="E4"
 $OEM[133]="E0"
 $OEM[134]="E5"
 $OEM[135]="E7"
 $OEM[136]="EA"
 $OEM[137]="EB"
 $OEM[138]="E8"
 $OEM[139]="EF"
 $OEM[140]="EE"
 $OEM[141]="EC"
 $OEM[142]="C4"
 $OEM[143]="C5"
 $OEM[144]="C9"
 $OEM[145]="E6"
 $OEM[146]="C6"
 $OEM[147]="F4"
 $OEM[148]="F6"
 $OEM[149]="F2"
 $OEM[150]="FB"
 $OEM[151]="F9"
 $OEM[152]="FF"
 $OEM[153]="D6"
 $OEM[154]="DC"
 $OEM[155]="F8"
 $OEM[156]="A3"
 $OEM[157]="D8"
 $OEM[158]="D7"
 $OEM[159]="83"
 $OEM[160]="E1"
 $OEM[161]="ED"
 $OEM[162]="F3"
 $OEM[163]="FA"
 $OEM[164]="F1"
 $OEM[165]="D1"
 $OEM[166]="AA"
 $OEM[167]="BA"
 $OEM[168]="BF"
 $OEM[169]="AE"
 $OEM[170]="AC"
 $OEM[171]="BD"
 $OEM[172]="BC"
 $OEM[173]="A1"
 $OEM[174]="AB"
 $OEM[175]="BB"
 $OEM[176]="A6"
 $OEM[177]="A6"
 $OEM[178]="A6"
 $OEM[179]="A6"
 $OEM[180]="A6"
 $OEM[181]="C1"
 $OEM[182]="C2"
 $OEM[183]="C0"
 $OEM[184]="A9"
 $OEM[185]="A6"
 $OEM[186]="A6"
 $OEM[187]="2B"
 $OEM[188]="2B"
 $OEM[189]="A2"
 $OEM[190]="A5"
 $OEM[191]="2B"
 $OEM[192]="2B"
 $OEM[193]="2D"
 $OEM[194]="2D"
 $OEM[195]="2B"
 $OEM[196]="2D"
 $OEM[197]="2B"
 $OEM[198]="E3"
 $OEM[199]="C3"
 $OEM[200]="2B"
 $OEM[201]="2B"
 $OEM[202]="2D"
 $OEM[203]="2D"
 $OEM[204]="A6"
 $OEM[205]="2D"
 $OEM[206]="2B"
 $OEM[207]="A4"
 $OEM[208]="F0"
 $OEM[209]="D0"
 $OEM[210]="CA"
 $OEM[211]="CB"
 $OEM[212]="C8"
 $OEM[213]="69"
 $OEM[214]="CD"
 $OEM[215]="CE"
 $OEM[216]="CF"
 $OEM[217]="2B"
 $OEM[218]="2B"
 $OEM[219]="A6"
 $OEM[220]="5F"
 $OEM[221]="A6"
 $OEM[222]="CC"
 $OEM[223]="AF"
 $OEM[224]="D3"
 $OEM[225]="DF"
 $OEM[226]="D4"
 $OEM[227]="D2"
 $OEM[228]="F5"
 $OEM[229]="D5"
 $OEM[230]="B5"
 $OEM[231]="FE"
 $OEM[232]="DE"
 $OEM[233]="DA"
 $OEM[234]="DB"
 $OEM[235]="D9"
 $OEM[236]="FD"
 $OEM[237]="DD"
 $OEM[238]="AF"
 $OEM[239]="B4"
 $OEM[240]="AD"
 $OEM[241]="B1"
 $OEM[242]="3D"
 $OEM[243]="BE"
 $OEM[244]="B6"
 $OEM[245]="A7"
 $OEM[246]="F7"
 $OEM[247]="B8"
 $OEM[248]="B0"
 $OEM[249]="A8"
 $OEM[250]="B7"
 $OEM[251]="B9"
 $OEM[252]="B3"
 $OEM[253]="B2"
 $OEM[254]="A6"
 $OEM[255]="A0"

Local $bRet=0

For $i=0 To UBound($OEM)-1
 $bRet=DllCall("User32.dll","Bool","OemToCharW","wstr",$OEM[$i],"wstr","")
ConsoleWrite($OEM[$i] & " = " & $bRet[2] & @CRLF)
Next

Saludos

Hi,

Many thanks for your answer .. but could you say me more as I have tried to use your code but I have

- Unicode : ♪♪2♪♪♪22♪♪♪♪ ♪1♪♪22♪2♪♪♪♪♪2♪ 2  ♪♪2♪2♪♪2♪♪2♪♪ if I use only the DllCall ....

or

- B6 = B A7 = A F7 = F B8 = B if I use your code

or

- 2D = 2D 2B = 2B A4 = A4 F0 = F0 D0 = D0 if I use your code with OemToChar in place of OemToCharW 

Many Thanks in advance

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

Maybe using  _WinAPI_WideCharToMultiByte.

Look:

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GuiEdit.au3>
;#include <WinAPIMisc.au3>


Local $line

$Parent = GUICreate  ("OemToCharW Test", 520, 260, -1, -1)
$Logbox = GUICtrlCreateEdit('', 10, 10, 500, 200); , BitOR($ES_READONLY, $WS_VSCROLL))
_GUICtrlEdit_SetLimitText($logbox, -1)
;$Logbox = _GUICtrlEdit_Create($Parent, "This is a test" & @CRLF & "Another Line", 10, 10, 500, 200)
$Button = GuiCtrlCreateButton("Run", 10, 220, 80, 20)
GuiSetState ()


While 1
    Dim $GUI_Msg = GuiGetMsg()
    Switch $GUI_Msg
        Case -3
            Exit
        Case -100 To 0
            ContinueLoop
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button
            _Check ()
    EndSwitch
Wend

Func _Check()
    GUICtrlSetData ($Button, "Stop")
    GUICtrlSetData($Logbox, "")

    ;Local $Pid = Run(@SystemDir & '\cmd /c "dir c:\ /s /O:N"', @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
;Local $Pid = Run(@SystemDir & '\cmd /c "dir c:\ /s /O:N"', @SystemDir, @SW_MAXIMIZE, $STDIN_CHILD + $STDOUT_CHILD)
    local $Pid = Run(@ComSpec & " /c " & "dir c:\ /S /O:N",@SystemDir,@SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
    MsgBox(0, "Pid", $Pid)
    While $Pid
        $msg = GUIGetMsg()
        Select
            Case $msg = $GUI_EVENT_CLOSE or $msg = $Button
                ProcessClose ($Pid)
                Exitloop
        EndSelect
        Dim $line = StdoutRead($Pid)
        If @error Then
            ExitLoop
        Else

            Local $iRet = _WinAPI_WideCharToMultiByte($line,0 ,True)
            If $iRet Then $line = $iRet
            _GUICtrlEdit_AppendText($Logbox, $line)

        EndIf
    WEnd
    GUICtrlSetData ($Button, "Run")
EndFunc



Func _ChangePageCode($sString, $iPageCode)
    Local $objConv = ObjCreate("OlePrn.OleCvt")
    return $objConv.ToUnicode($sString,$iPageCode)
EndFunc

Saludos

Edited by Danyfirex

Share this post


Link to post
Share on other sites

Maybe using  _WinAPI_WideCharToMultiByte.

Look:

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GuiEdit.au3>
;#include <WinAPIMisc.au3>


Local $line

$Parent = GUICreate  ("OemToCharW Test", 520, 260, -1, -1)
$Logbox = GUICtrlCreateEdit('', 10, 10, 500, 200); , BitOR($ES_READONLY, $WS_VSCROLL))
_GUICtrlEdit_SetLimitText($logbox, -1)
;$Logbox = _GUICtrlEdit_Create($Parent, "This is a test" & @CRLF & "Another Line", 10, 10, 500, 200)
$Button = GuiCtrlCreateButton("Run", 10, 220, 80, 20)
GuiSetState ()


While 1
    Dim $GUI_Msg = GuiGetMsg()
    Switch $GUI_Msg
        Case -3
            Exit
        Case -100 To 0
            ContinueLoop
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button
            _Check ()
    EndSwitch
Wend

Func _Check()
    GUICtrlSetData ($Button, "Stop")
    GUICtrlSetData($Logbox, "")

    ;Local $Pid = Run(@SystemDir & '\cmd /c "dir c:\ /s /O:N"', @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
;Local $Pid = Run(@SystemDir & '\cmd /c "dir c:\ /s /O:N"', @SystemDir, @SW_MAXIMIZE, $STDIN_CHILD + $STDOUT_CHILD)
    local $Pid = Run(@ComSpec & " /c " & "dir c:\ /S /O:N",@SystemDir,@SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
    MsgBox(0, "Pid", $Pid)
    While $Pid
        $msg = GUIGetMsg()
        Select
            Case $msg = $GUI_EVENT_CLOSE or $msg = $Button
                ProcessClose ($Pid)
                Exitloop
        EndSelect
        Dim $line = StdoutRead($Pid)
        If @error Then
            ExitLoop
        Else

            Local $iRet = _WinAPI_WideCharToMultiByte($line,0 ,True)
            If $iRet Then $line = $iRet
            _GUICtrlEdit_AppendText($Logbox, $line)

        EndIf
    WEnd
    GUICtrlSetData ($Button, "Run")
EndFunc



Func _ChangePageCode($sString, $iPageCode)
    Local $objConv = ObjCreate("OlePrn.OleCvt")
    return $objConv.ToUnicode($sString,$iPageCode)
EndFunc

Saludos

Hi,

Many thanks for your help.

Using your code Autoit does not crash but no convertion is made.

I have tried (with help file) and your advice with _WinAPI_WideCharToMultiByte to change iCodePage parameter but there i no change.

I have tried too the _WinAPI_MultiByteToWideChar but no change.

I will keep it "as this" without conversion in the first time ... because as you give to the end user the possibility to have an ouput ... 99% never read the output :)

French with all accentuated characters is always a nightmare but I think that spanish language is not more easy to convert :)

Many thanks one more time for your help.

Share this post


Link to post
Share on other sites

-1073741819 or 0xC0000005 means Access Violation. It means you have read or written from/to a memory location you don't have permission to access/write.

It's not a x86 / x86_64 problem, not a software problem.

OemToChar's 2nd parameter is marked as out. It's not a string but a LPTSTR (Long Pointer to Tchar String). The OS (Windows) must have write permission to write to the memory at that pointer address. But you pass a normal (and empty) string by value. It's then converted to LPCSTR (same as the 1st parameter type), which means a const string. So it's definitely an access violation since you cannot write to a const string.

You should do like this (non-tested, but it should work):

  • Allocate some memory large enough to store your string. Using $tBuffer = DllStructCreate('align 1;CHAR[128]'). This will allocate a memory block large enough to hold 128 ansi characters. Change the size as you want.
  • Pass the pointer to that memory block to the function, like this
    DllCall("User32.dll", "BOOL", "OemToChar", "str", $line, "ptr", DllStructGetPtr($tBuffer))
  • Retrieve the string using DllStructGetData(tBuffer, 1)

99 little bugs in the code

99 little bugs!

Take one down, patch it around

117 little bugs in the code!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0