level 11
首先我们需要一个命令行模块,下面我就贴一下命令行模块的代码、
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
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
但这样做出来的不是真正的命令行程序。还需要修改一下才行。
首先,把Sub Main中的AllocConsole和FreeConsole去掉,然后编译。
2013年08月29日 00点08分
5
level 11
但这样是不能正常运行的。只要修改一下程序就行了。
新建一个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
再用cmd调用刚刚的程序,发现确实可以直接在cmd中读写字符串
2013年08月29日 00点08分
7
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
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