【教程】VB制作真正的控制台程序
vb吧
全部回复
仅看楼主
level 11
wucaibinfen1 楼主
成品
镇楼

注意程序运行的结果显示在cmd窗口中,并没有另开一个命令行窗口,
而使用AllocConsole做出来的是会另开一个窗口的
2013年08月29日 00点08分 1
level 11
wucaibinfen1 楼主
首先我们需要一个命令行模块,下面我就贴一下命令行模块的代码、
2013年08月29日 00点08分 2
你没看过defanive的教程吗,他早就发了,表示你火星了
2013年08月29日 02点08分
回复 辛时雨 :求链接,我没注意到诶
2013年08月29日 03点08分
回复 辛时雨 :你好像没认真听讲诶,6楼才是本教程的重点[吐舌]
2013年08月29日 03点08分
level 11
wucaibinfen1 楼主
Option Explicit
'''''D E C L A R A T I O N S''''''''''''''''''''''''''''''''''''
Public Declare Function AllocConsole Lib "kernel32" () As Long
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 ReadConsole Lib "kernel32" Alias "ReadConsoleA" _
(ByVal hConsoleInput As Long, ByVal lpBuffer As String, _
ByVal nNumberOfCharsToRead As Long, lpNumberOfCharsRead As Long, _
lpReserved As Any) As Long
Public Declare Function SetConsoleMode Lib "kernel32" (ByVal _
hConsoleOutput As Long, dwMode As Long) As Long
Public Declare Function SetConsoleTextAttribute Lib _
"kernel32" (ByVal hConsoleOutput As Long, ByVal _
wAttributes As Long) As Long
Public Declare Function SetConsoleTitle Lib "kernel32" Alias _
"SetConsoleTitleA" (ByVal lpConsoleTitle 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
''''C O N S T A N T S'''''''''''''''''''''''''''''''''''''
'I/O handlers for the console window. These are much like the
'hWnd handlers to form windows.Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&
Public Const STD_ERROR_HANDLE = -12&'Color values for SetConsoleTextAttribute.
Public Const FOREGROUND_BLUE = &H1
Public Const FOREGROUND_GREEN = &H2
Public Const FOREGROUND_RED = &H4
Public Const FOREGROUND_INTENSITY = &H8
Public Const BACKGROUND_BLUE = &H10
Public Const BACKGROUND_GREEN = &H20
Public Const BACKGROUND_RED = &H40
Public Const BACKGROUND_INTENSITY = &H80'For SetConsoleMode (input)
Public Const ENABLE_LINE_INPUT = &H2
Public Const ENABLE_ECHO_INPUT = &H4
Public Const ENABLE_MOUSE_INPUT = &H10
Public Const ENABLE_PROCESSED_INPUT = &H1
Public Const ENABLE_WINDOW_INPUT = &H8
'For SetConsoleMode (output)
Public Const ENABLE_PROCESSED_OUTPUT = &H1
Public Const ENABLE_WRAP_AT_EOL_OUTPUT = &H2'''''G L O B A L S'''''''''''''''''''''''''''''''''''
Public hConsoleIn As Long ' The console's input handle
Public hConsoleOut As Long ' The console's output handle
Public hConsoleErr As Long ' The console's error handle'''''M A I N'''''''''''''''''''''''''''''''''''''''''
Public Sub Main()
Dim szUserInput As String
AllocConsole '建立一个控制台窗口
SetConsoleTitle "VB Console Example" '设置窗口标题 '获得控制窗口的句柄
hConsoleIn = GetStdHandle(STD_INPUT_HANDLE)
hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE)
hConsoleErr = GetStdHandle(STD_ERROR_HANDLE)
SetConsoleTextAttribute hConsoleOut, _
FOREGROUND_RED Or FOREGROUND_GREEN _
Or FOREGROUND_BLUE
'----------此处程序代码开始-------------
mdlProgram.Start
'----------程序代码到此结束-------------
FreeConsole ' Destroy the console
End Sub
'''''F U N C T I O N S'''''''''''''''''''''''''''''''''''
F+F+++++++++++++++++++++++++++++++++++++++++++++++++++
' Function: COut
'
' Summary: Prints the output of a string
'
' Args: String ConsolePrint
' The string to be printed to the console's ouput buffer.
'
' Returns: None
'
'-----------------------------------------------------
Public Sub COut(szOut As String)
WriteConsole hConsoleOut, szOut, LstrLen(szOut), vbNull, vbNull
End Sub
'F+F++++++++++++++++++++++++++++++++++++++++++++++++++++
' Function: LIn
'
' Summary: Gets a line of input from the user.
'
' Args: None
'
' Returns: String ConsoleRead
' The line of input from the user.
'---------------------------------------------------F-F
Public Function LIn() As String
Dim sUserInput As String * 256
Call ReadConsole(hConsoleIn, sUserInput, Len(sUserInput), vbNull, vbNull)
'Trim off the NULL charactors and the CRLF.
LIn = Left$(sUserInput, InStr(sUserInput, Chr$(0)) - 3)
End Function
2013年08月29日 00点08分 3
代码排版有误,Public Const STD_INPUT_HANDLE = -10&前加一个回车
2013年08月29日 03点08分
Public Declare Function SetConsoleMode Lib "kernel32" (ByVal hConsoleOutput As Long, dwMode As Long) As Long 的dwMode前面没有ByVal,楼主你害死我了...
2014年04月27日 06点04分
@13x123456 SetConsoleMode 用不到呀,其实这个代码真正用到的只有: GetStdHandle、LstrLen、ReadConsole、SetConsoleTitle、WriteConsole 而:SetConsoleTextAttribute 貌似只是设置颜色的,可以不用。 另外:FreeConsole 不一定用
2020年07月24日 18点07分
level 11
wucaibinfen1 楼主
使用方法:读取一行是LIn,输出文字是COut
2013年08月29日 00点08分 4
level 11
wucaibinfen1 楼主
但这样做出来的不是真正的命令行程序。还需要修改一下才行。
首先,把Sub Main中的AllocConsole和FreeConsole去掉,然后编译。
2013年08月29日 00点08分 5
level 11
wucaibinfen1 楼主
但这样是不能正常运行的。只要修改一下程序就行了。
新建一个VB工程,运行以下代码
Sub Main()
Open "{这里填写编译出的文件的路径}" For Binary As #1
Seek #1, &H115
Put #1, , CLng(3)
Close #1
End Sub
2013年08月29日 00点08分 6
level 11
wucaibinfen1 楼主
再用cmd调用刚刚的程序,发现确实可以直接在cmd中读写字符串
2013年08月29日 00点08分 7
level 10
嗷呜~~来支持下咯
2013年08月29日 00点08分 8
level 4
问一下, 两个for循环嵌套,子循环的语句中有exit for那么是跳出整个for循环还是跳出子循环?谢谢大神
2013年08月29日 03点08分 9
只跳出子循环
2013年08月29日 03点08分
level 14
楼主请注意,只要用AllocConsole自己创建的都不是真正的控制台。
真正的控制台是系统给你创建的,不是你自己创建。
真正的控制台是在链接时由链接参数的子系统指定。
所以VB做真正的控制台应该要拦截link.exe,把链接参数中的:Windows改成:Console,并且还要用资源修改程序把exe的图标删掉。
2013年08月29日 15点08分 13
AllocConsole的问题,请看5楼,拦截链接器的问题,我不是按你这个方法做的,我是链接完后直接修改exe(见6楼),又是一个没认真听讲的[汗]
2013年08月29日 23点08分
回复 wucaibinfen1 :所以说你是SB,我又不是不知道可以修改exe。你的方法很明显是错的,子系统的的位置不是固定的。并且你这样修改exe还不如链接参数方便,还不会出错。
2013年08月30日 03点08分
回复 yjryym :位置固定的!自己看PE结构
2013年08月30日 03点08分
回复 yjryym :自己不懂EXE文件结构还骂人
2013年08月30日 03点08分
level 11
wucaibinfen1 楼主
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
//
// NT additional fields.
//
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;//就在此处!
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
}
@yjryym
谁跟你讲子系统位置不固定的,就在PE可选头的第23个字段!
2013年08月30日 03点08分 14
level 7
现在由于开学季,贴吧开始了客户端三倍经验的活动。
导致吧友们大量为此二进行无意义水贴,引起了霸屏的现象。
因为这样会影响吧友正常的看帖与发帖,所以三倍经验的帖子将会删除,违者封禁!
请吧友们谅解,理性发帖。
2013年08月30日 04点08分 15
level 13
帮顶。看起来比.net包装spoon处理法代码长了不少。
2013年08月31日 01点08分 16
level 6
VB6 Sirk Mini 里有“命令行程序”选项
2017年06月28日 04点06分 17
level 1
今天在 http://vb.mvps.org/samples/Console/ 下载了个VB6控制台输入输出代码,因为E文不好,没有仔细看说明,里面编译好的实例程序都正常,但是我自己修改代码后编译的全都不能显示,刚刚搜到贴主的文章,才发现6楼果然是真正的核心。用二进制编辑器修改之前我自己编译的exe文件后,果然工作正确了。
同时我发现,编译为 P代码 和编译为 本机代码 那个偏移量是不一样的。P代码 方式编译的exe其偏移量是 &H10D,编译为 本机代码 的偏移量才是 &H115 。不过同样都是 02 改为 03 。
感谢贴主给出的详细代码!
2020年07月24日 18点07分 18
level 7
干嘛用的
2020年07月25日 00点07分 19
让VB6程序在使用批处理调用执行时,显示一些信息到cmd窗口
2020年07月25日 16点07分
1