最近正在做一个批处理转EXE的程序,做的还不错,唯一的问题就是不支持中文字符。
这个项目分为两个EXE,一个是生成器,还有一个是负责执行的。
在负责执行的程序尾部加上batchStart[批处理内容](可以直接用echo之类的)然后再执行这个程序就可以执行相应的批处理
看上去一切都挺完美的,就是批处理中中文字符全部自动丢失。
有高手能解决吗?
这个是负责执行的部分,就这么多代码,窗口上没有任何控件。Private Sub Form_Load()Me.HideOpen App.path & "\" & App.EXEName & ".exe" For Binary As #1
    ReDim bytData(LOF(1)) As Byte
    Get #1, 1, bytData
Close #1
For i = 0 To UBound(bytData) - 3
contents = contents & Chr(bytData(i))
contents = Replace(contents, Chr(0), "")
Next
'把exe所有的东西都读进来,并且防止\0结束文件datas = Split(contents, "batchStart")
batch = datas(UBound(datas))
'这个就是提取后面的批处理文字了
path = "C:\temp.bat"Open path For Output As #1
Print #1, batch
Close #1
'把这东西释放出去
r = Shell(Chr(34) & path & Chr(34) & " " & Command, vbNormalFocus)
'然后执行,跟命令行
End
End Sub
还有是生成器代码
有一个文本框batchBox和按钮Command1,是转换按钮
代码同样很短Private Sub Command1_Click()
If Dir("batch.data") = "" Then
MsgBox "Sorry , batch.data Not Found"
End
End IfOpen "temp" For Output As #1
Print #1, "batchStart"
Print #1, batchBox.Text
Close #1
r = Shell("cmd /c copy /b batch.data + temp output.exe", vbHide)
MsgBox "OK! Saved to output.exe"
End Sub
把负责执行的编译好,重命名为batch.data,放到生成器同目录下,就可以把批处理转换成EXE了
可是在批处理中,如果有中文字符,比如 msg %username% 中文测试 就无法执行,
而英文可以执行
有哪位高手能帮忙改一改吗?感激不禁了。
可以的话顺便帮忙优化一下执行部分的效率

解决方案 »

  1.   


    For i = 0 To UBound(bytData) - 3
    Contents = Contents & Chr(bytData(i))
    Contents = Replace(Contents, Chr(0), "")
    Next
    '将上面一段注释或删除掉,改为下面一句测试看看
    Contents = Replace$(StrConv(bytData, vbUnicode), vbNullChar, vbNullString)
      

  2.   

    如果你还要写的更复杂一些,可能需要下面一些API。
    我手里也写了个执行控制台程序或者获取控制台程序执行时的显示文本的模块,就是用这些API写的,当然其中也包括了批处理的显示文本,就是说如果你的批处理如果在执行期间(比如在CMD下)是有一些提示文本或其他信息的话,而你希望在你的WIN程序中显示而不是用CMD的黑窗口显示的话,就需要这些了。Private Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
    Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As Long, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Long) As Long
    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Private Declare Function GenerateConsoleCtrlEvent Lib "kernel32" (ByVal dwCtrlEvent As Long, ByVal dwProcessGroupId As Long) As Long
      

  3.   

    请问楼主 batchBox.Text,录入什么值?
      

  4.   

    for 循环如下修改
    contents = StrConv(bytData, vbUnicode) '一次性转换'
    contents = Replace(contents, Chr(0), "") '只需要替换一次'
      

  5.   

    很感谢shier2817的回答
    已经可以使用中文了
      

  6.   

    而且效率好像也高了许多哦
    没有了for循环,非常感谢