两 API 三步最简实现 VB6 输出到CMD控制台显示 (含获取输入),真输出至 CMD 窗口,非 AllocConsole 模式

18 篇文章 0 订阅
6 篇文章 0 订阅

注:以下核心代码部分来自:https://tieba.baidu.com/p/2561344540?red_tag=1334161657 。

    写了个数据处理程序,正常运行时用 DOS 批处理命令行模式执行,因执行时间较长,就想给它在 CMD 窗口看到实时运行结果反馈(不能使用msgbox),找了一圈,找到好多代码,执行附带的示例程序都是正常的,但是用那些代码编译后就是无法显示。疑惑之下,找到了 https://tieba.baidu.com/p/2561344540?red_tag=1334161657 中的详细解释,试了一把,成了!随后我自己又试了多种组合模式,以此文记录。

ps:AllocConsole 方式得到的程序不支持在 CMD 窗口输出!不能使用 AllocConsole

废话不多说,两个核心 API 三步最简实现VB6输出到控制台显示:

目录

一,定义API及全局变量等:

二, API 使用方法:

'示例1,无窗体模式:

'示例2,窗体模式:

'示例3,窗体混合模式:

三,修改编译后的 EXE 文件:

方法一,直接使用二进制编辑器或自己写另一个代码修改:

方法二,用VBS代码重新连接第二步编译好的exe文件:

四,执行效果

4.1 窗口模式直接执行

4.2 混合模式或无窗体模式批处理方式执行

五,控制台标题设置、控制台键盘输入获取及更改显示颜色等源代码下载


一,定义API及全局变量等:

'添加模块,取名 DOSConsole.bas ,写入以下代码

Option Explicit
'---------定义所需API
Public Declare Function FreeConsole Lib "kernel32" () As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
Public Declare Function LstrLen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
Public Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" (ByVal hConsoleOutput As Long, ByVal lpBuffer As Any, ByVal nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, lpReserved As Any) As Long
'-------------常量定义
Public Const STD_OUTPUT_HANDLE = -11&
'-----------定义全局变量
Public hConsoleOut As Long ' The console's output handle
'---------定义函数
Public Sub Initialize() '---初始化获取句柄
    '获得控制窗口的句柄
    hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE)
End Sub
Public Sub Terminate() '-----销毁句柄
    Call FreeConsole ' Destroy the console
    Call CloseHandle(hConsoleOut)
End Sub
Public Sub COut(szOut As String)   '------文字输出到控制台函数
    WriteConsole hConsoleOut, szOut, LstrLen(szOut), vbNull, vbNull
End Sub

二, API 使用方法:

'在 sub main() 或 Sub Form_Load() 内先 执行初始化函数:Initialize 
'在 sub main() 尾部 或 Sub Form_QueryUnload 中执行销毁函数:Terminate
'在 sub main() 中部 或 Sub Command1_Click() 中执行输出函数:Call COut("VB6 控制台" & vbCrLf)

'示例1,无窗体模式:

Public Sub Main()
    Call Initialize
    '----------此处程序显示代码开始-------------
    Call COut("VB6 控制台" & vbCrLf)
    '----------程序代码到此结束-------------
    Call Terminate
    end
End Sub

'示例2,窗体模式:

Private Sub Form_Load()
    Call Initialize
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Call Terminate
End Sub
Private Sub Command1_Click()
    Call COut("VB6 控制台" & vbCrLf)
End Sub

'示例3,窗体混合模式:

'模块1:

Public Sub Main()
    Call Initialize
    Call COut("VB6 控制台" & vbCrLf)
    Load Form1
    Form1.Show
End Sub

'窗体模块:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Call Terminate
End Sub
Private Sub Command1_Click()
    Call COut("VB6 控制台" & vbCrLf)
End Sub

完成以上步骤后,执行是没有效果的,需要进行下面的第三步,这才是关键部分。

三,修改编译后的 EXE 文件:

以上代码编译后的exe文件还不能实现CMD控制台模式输出,需要对exe文件进行修改才行,有两种修改方法。

方法一,直接使用二进制编辑器或自己写另一个代码修改:

用二进制修改指定偏移量位置处的数字,注意以下所说文件起点偏移量为1,而大多数二进制编辑器起点计为0,使用时需要注意
P-代码 方式编译的exe其偏移量是 &H10D,编译为 本机代码 的偏移量是 &H115 , 将该位置的 02 改为 03 即可。
以 本机代码 方式编译的exe修改为例,还可用以下另一个代码进行修改:

新建一个VB工程,运行以下代码:

Sub Main()
    Open "{这里填写编译出的文件的路径}" For Binary As #1
    Seek #1, &H115
    Put #1, , CLng(3)
    Close #1
End Sub

方法二,用VBS代码重新连接第二步编译好的exe文件:

新建VBS文件(LinkConsole.vbs),内容如下(保存关闭):

Option Explicit
Dim strLINK, strEXE, WSHShell
' Be sure to set up strLINK to match your VB6 installation.
strLINK = """C:\Program Files\Microsoft Visual Studio\VB98\LINK.EXE"""
strEXE = """" & WScript.Arguments(0) & """"
Set WSHShell = CreateObject("WScript.Shell")
WSHShell.Run strLINK & " /EDIT /SUBSYSTEM:CONSOLE " & strEXE
Set WSHShell = Nothing
WScript.Echo "Complete!"

使用方法:将第二步中编译好的exe文件按鼠标左键拖放到以上新建的 LinkConsole.vbs 文件图标上,即会执行 LINK.EXE 重编译exe为控制台模式,注意你自己的 VB6 的安装位置,以上 LinkConsole.vbs 文件中为使用默认路径安装(C:\Program Files\Microsoft Visual Studio\VB98\)的路径。

四,执行效果

4.1 窗口模式直接执行

至此,直接运行你用以上方法处理完成的 exe 文件就会出现控制台窗口,并显示设定内容:

4.2 混合模式或无窗体模式批处理方式执行

可以编写批处理文件,内容如:

VB6Console.exe
pause

然后执行改批处理文件,即可在 CMD 窗口中实现输出设定内容:

此记!

五,控制台标题设置、控制台键盘输入获取及更改显示颜色等源代码下载

简介:如需控制台标题设置及设定显示颜色等完整代码,请前往下载。

本源码为 VB6 以控制台或 cmd.exe 窗口方式显示和接受输入文字,在用批处理调用时可直接在 cmd.exe 窗口输出文字显示并可获取键盘输入到程序内处理。同时还支持输出文字颜色和背景颜色设置,给您不一样的个性化显示界面!
注:AllocConsole 创建的控制台窗口是独立新建的,在用批处理调用时是无法在 cmd.exe 窗口输出的,因此本代码不用 AllocConsole 。

使用说明:

核心代码为 DOSConsole.bas ,使用前请先执行 Initialize ,程序关闭前请执行 Terminate。

输出文字到控制台为 COut , 为便于个性化,请在字符结尾自行决定是否添加 vbcrlf 
获取控制台输入字符为 LIn
设置控制台标题栏文字为 setTitle
设置输出文字颜色和背景颜色为 setCONColor(f,b) ,其中,f 为文字颜色,b 为背景颜色,设置后在下一次输出时生效,颜色代码对应列表请看本文件夹内:控制台色卡.png 或参考 QBColor 函数

注意:您的程序修改编译完成后,控制台输入输出功能还不能正常工作,这不是代码有问题,而是必须对编译好的程序进行二进制修改才能正确工作,具体步骤如下:

将编译好的 exe 文件按鼠标左键拖放到本文件夹下 LinkConsole.vbs 文件图标上,即可,其会执行 LINK.EXE 重编译 exe 为控制台模式。

至此,即可直接运行处理好的程序查看运行效果,或用批处理方式调用运行了。

注意你自己的 VB6 的安装位置,以上 LinkConsole.vbs 文件中为使用默认路径安装(C:\Program Files\Microsoft Visual Studio\VB98\)的路径。

另外,测试批处理调用效果请执行:runtest.bat 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jessezappy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值