vb控制台怎么输出,注意是控制台,不是print和msgbox
注:以下核心代码来自:https://tieba.baidu.com/p/2561344540?red_tag=1334161657 。
废话不多说,三步最简实现VB6输出到控制台显示
第一步,定义API及全局变量等:
'添加模块,取名 DOSConsole.bas ,写入以下代码
Option Explicit
'---------定义所需API
Public Declare Function FreeConsole Lib "kernel32" () 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() '-----销毁句柄
FreeConsole ' Destroy the console
End Sub
Public Sub COut(szOut As String) '------文字输出到控制台函数
WriteConsole hConsoleOut, szOut, LstrLen(szOut), vbNull, vbNull
End Sub
第二步,使用方法:
'在 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文件:
方法来自: http://vb.mvps.org/samples/Console/
新建VBS文件(LinkConsole.vbs),内容如下(保存关闭):
' LinkConsole.vbs
' http://www.angelfire.com/mi4/bvo/vb/vbconio.htm
'
' This is a WSH script used to make it easier to edit
' a compiled VB6 EXE using LINK.EXE to create a console
' mode program.
'
' Drag the EXE's icon onto the icon for this file (or onto
' a shortcut to this file), or execute it from a command
' prompt as in:
'
' LinkConsole.vbs Project1.exe
'
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!"
VBS使用方法:将第二步中编译好的exe文件按鼠标左键拖放到以上新建的 LinkConsole.vbs 文件图标上,即会执行 LINK.EXE 重编译exe为控制台模式,注意你自己的 VB6 的安装位置,以上 VBS 文件中为使用默认路径安装(C:\Program Files\Microsoft Visual Studio\VB98\)的。
至此,直接运行你用以上方法处理完成的 exe 文件就会出现控制台窗口,并显示设定内容:
也可以编写批处理文件,内容如:
VB6Console.exe
pause
然后执行改批处理文件,即可在 CMD 窗口中实现输出设定内容:
后记:以上核心函数为 GetStdHandle 和 WriteConsole 这两个。
MsgBox 函数
在对话框中显示消息,等待用户单击按钮,并返回一个 Integer 告诉用户单击哪一个按钮。
语法
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
MsgBox 函数的语法具有以下几个命名参数:
部分 描述
Prompt 必需的。字符串表达式,作为显示在对话框中的消息。prompt 的最大长度大约为 1024 个字符,由所用字符的宽度决定。如果 prompt 的内容超过一行,则可以在每一行之间用回车符 (Chr(13))、换行符 (Chr(10)) 或是回车与换行符的组合 (Chr(13) & Chr(10)) 将各行分隔开来。
Buttons 可选的。数值表达式是值的总和,指定显示按钮的数目及形式,使用的图标样式,缺省按钮是什么以及消息框的强制回应等。如果省略,则 buttons 的缺省值为 0。
Title 可选的。在对话框标题栏中显示的字符串表达式。如果省略 title,则将应用程序名放在标题栏中。
Helpfile 可选的。字符串表达式,识别用来向对话框提供上下文相关帮助的帮助文件。如果提供了 helpfile,则也必须提供 context。
Context 可选的。数值表达式,由帮助文件的作者指定给适当的帮助主题的帮助上下文编号。如果提供了 context,则也必须提供 helpfile。
都说了不是Msgbox,控制台