⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsyks.asm

📁 驾驶员考试系统,汇编编写,qq332779423
💻 ASM
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	Current Version -- Ver 0.02 (2005.04)
;	CopyRight By Pmason_rose@msn.com
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DEBUG		equ		0
;		_Debug		"插入显示字符串"
;		_Debug		"显示寄存器或 double word 变量","edi 的值",edi
;		_Debug		"显示两个寄存器或 double word 变量","szTestByte 地址",offset szTestByte,"szTestText 地址",offset szTestText
;		_DebugString	"显示内存中的字符串",addr szTestText
;		_DebugMemory	"显示指定的内存内容",addr szTestByte,sizeof szTestByte
;Debug程序作者:罗云彬
;GIF显示库由aogo改编
;各个文件智力成果属于各个文件作者
.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive

include	equ.inc
include jsyks.inc
include TabMain.asm

.code
start:

	invoke	GetModuleHandle,NULL
	mov		hInstance,eax
	invoke	InitGIFLib,hInstance,0	;初始化gif库
    invoke	InitCommonControls
	invoke	DialogBoxParam,hInstance,LOGIN_DIALOG,NULL,addr DlgProc,NULL
	invoke	ExitProcess,0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 登陆对话框过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

	mov		eax,uMsg
	.if eax==WM_INITDIALOG
		push	hWin
		pop		hLOGIN_DIALOG
	.elseif eax==WM_COMMAND
		mov	eax,wParam
		.if		ax ==	IDC_EDITTEXT_PASSWD
			invoke	GetDlgItemText,hWin,IDC_EDITTEXT_PASSWD,addr szBuffer_Passwd,sizeof szBuffer_Passwd
		.elseif	ax ==	IDC_PUSHBUTTON_LOGIN
			invoke	My_Proc,hWin
;			invoke	My_Quit,hWin
		.elseif	ax ==	IDC_PUSHBUTTON_CANCEL
			invoke	My_Quit,hWin
		.endif
	.elseif eax==WM_CLOSE
			invoke	My_Quit,hWin
	.else
		mov		eax,FALSE
		ret
	.endif
	mov		eax,TRUE
	ret

DlgProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 初始化代码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
My_Proc		proc	hWin:HWND
		local	@dwItem
		invoke ODBCConnect,hWin
;;接下来,程序将获得一个语句句柄.
		invoke SQLAllocHandle, SQL_HANDLE_STMT, hConn, addr hStmt
		.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
			invoke lstrcpy, addr Conn, addr SQLStatement
			invoke lstrcat, addr Conn, addr WhereStatement
			invoke SQLBindParameter,hStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,25,0, addr SearchName,25,addr StrLenX
			invoke SQLPrepare, hStmt, addr Conn, sizeof Conn
		.else
			invoke MessageBox,hWin,addr AllocStmtFail, addr AppName, MB_OK+MB_ICONERROR
			invoke EndDialog, hWin,0
		.endif	
		
		invoke GetDlgItemText, hWin, IDC_EDITTEXT_USERNAME, addr SearchName, 25
		.if ax==0
			invoke MessageBox, hWin,addr NoData, addr AppName, MB_OK+MB_ICONERROR
			invoke GetDlgItem, hWin, IDC_EDITTEXT_USERNAME
			invoke SetFocus, eax
		.else
			invoke lstrlen,addr SearchName
			mov		StrLenX,eax
			invoke SQLExecute, hStmt
			invoke SQLBindCol, hStmt,1,SQL_C_CHAR, addr ThePasswd, sizeof ThePasswd,addr PasswdLength
			mov	@dwItem,0
			and	dwFlag,not	ID_LOGIN_ACEPT	;以后仔细测试此标志
			.while	TRUE
				invoke SQLFetch, hStmt
				.if	ax == SQL_SUCCESS || ax == SQL_SUCCESS_WITH_INFO
;绑定后返回的数据在   ThePasswd   的内存里
;比较字符串(区分大小写),用在搜索字符串,十六进制数据列,整数
					invoke	My_cmpstri,addr ThePasswd,addr szBuffer_Passwd,sizeof ThePasswd
					.if		eax
						or	dwFlag,ID_LOGIN_ACEPT	;用户名和密码正确则设置允许登录标志
					.else
;;用户名和密码不正确则
					.endif
						inc	@dwItem
				.else
					.break
				.endif
			.endw
			test	dwFlag,ID_LOGIN_ACEPT
			.if	ZERO?
				invoke MessageBox,hWin,addr szErr_LOGIN,addr szNull,MB_OK
			.else
				invoke EndDialog,hWin,NULL
				invoke DialogBoxParam,hInstance,IDD_TABMAIN,NULL,addr DlgMainProc,NULL
			.endif
		.endif
	ret

My_Proc		endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 退出程序 -- 保存数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
My_Quit		proc	hWin:HWND
	invoke SQLFreeHandle, SQL_HANDLE_STMT, hStmt
	invoke ODBCDisconnect,hWin
	invoke EndDialog,hWin,0
	ret

My_Quit		endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 连接数据库
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ODBCConnect proc hWin:DWORD
	invoke SQLAllocHandle, SQL_HANDLE_ENV, SQL_NULL_HANDLE, addr hEnv
;	调用SQLAllocHandle来分配一个环境句柄
	.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
;   获得环境句柄后,程序调用SQLSetEnvAttr来表示将要使用ODBC 3.x的语法.
		invoke SQLSetEnvAttr, hEnv,SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3,0
		.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
;   程序将通过调用SQLAllocHandle获得连接句柄来实现连接
			invoke SQLAllocHandle, SQL_HANDLE_DBC, hEnv, addr hConn
			.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
				invoke lstrcpy,addr ConnectString,addr strConnect
				invoke lstrcat,addr ConnectString, addr ProgPath
				invoke lstrcat, addr ConnectString,addr DBName
;;  接着填写连接字符串.完整的连接字符串将被用在ConnectionString
;>当连接字符串完成,程序将调用SQLDriverConnect来通过MS Access ODBC 驱动程序连接
				invoke SQLSetConnectAttr,hConn,SQL_ATTR_ODBC_CURSORS,SQL_CUR_USE_ODBC,0
				invoke SQLDriverConnect, hConn, hWin, addr ConnectString, sizeof ConnectString, \
						addr Conn, sizeof Conn,addr StrLenX, SQL_DRIVER_COMPLETE
				.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
;;现在,到数据库的连接已经建立并被打开,并一直保持打开状态直到用户选择关闭
;					invoke MessageBox,hWin, addr Conn,addr ConnectCaption,MB_OK+MB_ICONINFORMATION
				.else
					invoke SQLFreeHandle, SQL_HANDLE_DBC, hConn
					invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv
					invoke MessageBox, hWin, addr ConnFail, addr AppName, MB_OK+MB_ICONERROR
				.endif
			.else
				invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv
				invoke MessageBox, hWin, addr AllocConnFail, addr AppName, MB_OK+MB_ICONERROR
			.endif
		.else
			invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv
			invoke MessageBox, hWin, addr SetAttrFail, addr AppName, MB_OK+MB_ICONERROR
		.endif
	.else
		invoke MessageBox, hWin, addr AllocEnvFail, addr AppName, MB_OK+MB_ICONERROR	
	.endif
	ret
ODBCConnect endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 断开数据库
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ODBCDisconnect proc hWin:DWORD
	invoke SQLDisconnect, hConn
	invoke SQLFreeHandle, SQL_HANDLE_DBC, hConn
	invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	invoke MessageBox,hWin,addr Disconnect, addr AppName,MB_OK+MB_ICONINFORMATION
	ret
ODBCDisconnect endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;------------------------------------------------------
;比较字符串(区分大小写),用在搜索字符串,十六进制数据列,整数
;相等返回true,否则返回false
My_cmpstr proc uses esi edi ecx lpSrc,lpDest,nLen
	xor eax,eax
	mov esi,lpSrc
	mov edi,lpDest
	mov ecx,nLen
	repz cmpsb
	.if zero?
		inc eax;mov eax,true
	.endif
	ret
My_cmpstr endp
;比较字符串(不分大小写),用在搜索不分大小的字符串
;相等返回true,否则返回false
My_cmpstri proc uses esi edi ebx ecx lpSrc,lpDest,nLen
	xor eax,eax
	mov esi,lpSrc
	mov edi,lpDest
	mov ecx,nLen
_cmpnext_:
	mov ah,[esi]
	mov al,[edi]
	inc esi
	inc edi
	mov bh,ah
	sub bh,al
	.if zero?
		loop _cmpnext_
	.elseif bh=='a'-'A' || bh=='A'-'a'
		.if ((ah>='a' && ah<='z') || (ah>='A' && ah<='Z')) && \
					((al>='a' && al<='z') || (al>='A' && al<='Z'))
			loop _cmpnext_
		.endif
	.endif
	xor eax,eax
	.if ecx==0
		inc eax;mov eax,true
	.endif
	ret
My_cmpstri endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -