📄 jsyks.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 + -