科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件MASM32编程使用自动完成功能

MASM32编程使用自动完成功能

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

MASM32编程使用自动完成功能

作者:Purpleendurer 来源: CSDN 2007年12月16日

关键字: 自动完成 MASM32

  • 评论
  • 分享微博
  • 分享邮件
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Function: Demo the method to call AutoComplete function
;    Author: Purple Endurer
;   DevEnv: Windows 2000 + Masm32 V8

;
; log
; -------------------------------------------------------
; 2006.10.11 Created!
; Note:
; 1. Need call CoInitialize() & CoUninitialize()
; 2. If using shlwapi.inc(include SHAutoComplete)
; & msi.inc(include DllGetVersion) included in MASM32,
; then the version of shlwapi.dll will be 3.1.4000,
; so this program can not demo the function.
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.386
.model flatstdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
include \masm32\include\ole32.inc

includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\ole32.lib

WinMain PROTO :DWORD, :DWORD, :DWORD, :DWORD

IDC_CkbOpen    equ 103
IDC_EdtCmd    equ 105

c_WinWidth    equ 400
c_WinHeight    equ 210

c_EditDemoTop    equ 5
c_EditDemoLeft    equ 2
c_EditDemoWidth    equ 250
c_EditDemoHeight    equ 20

c_CkbOpenTop    equ c_EditDemoTop
c_CkbOpenLeft    equ (c_EditDemoLeft+c_EditDemoWidth+5)
c_CkbOpenWidth    equ 130
c_CkbOpenHeight    equ c_EditDemoHeight

SHACF_AUTOSUGGEST_FORCE_ON = 10000000h
;忽略注册表的设置并且打开autosuggest特性。它必须和SHACF_FILESYSXXX或者SHACF_URLXXX联合使用
SHACF_AUTOSUGGEST_FORCE_OFF = 20000000h
;忽略注册表的设置并且关闭autosuggest特性。它必须和SHACF_FILESYSXXX或者SHACF_URLXXX联合使用
SHACF_AUTOAPPEND_FORCE_ON = 40000000h
;忽略注册表的设置并且打开autoappend特性,它必须和SHACF_FILESYSXXX或者SHACF_URLXXX联合使用
SHACF_AUTOAPPEND_FORCE_OFF = 80000000h
;忽略注册表的设置并且关闭autoappend特性,它必须和SHACF_FILESYSXXX或者SHACF_URLXXX联合使用
SHACF_DEFAULT = 0h      ;缺省设置。它和SHACF_FILESYSTE|SHACF_URLALL等价。不能和任何标志值联合使用
SHACF_FILESYSTEM = 1h   ;包含文件系统和虚拟文件夹(比如桌面或是控制面板)
SHACF_URLHISTORY = 2h   ;包含历史记录的URL列表
SHACF_URLMRU = 4h       ;包含最近使用过的URL列表
SHACF_URLALL = (SHACF_URLHISTORY or SHACF_URLMRU)

DLLVER_PLATFORM_WINDOWS = 1h    ;函数适合于任何Windows平台
DLLVER_PLATFORM_NT = 2h         ;函数适合于Windows NT平台


m_m2m MACRO d1, d2
  push d2
  pop  d1
ENDM


.data
g_szClsName     db "AutoCompleteCls", 0
g_szFailOpen    db "无法开启"
g_szAppName      db "自动完成功能演示", 0
g_szEditCls    db "EDIT", 0
g_szBtnCls    db "button", 0
g_szCkbOpenText    db "开启自动完成功能", 0
g_szFailGetVerNo    db "无法检测Shlwapi.dll的版本号", 0
g_szVerFmt    db "Shlwapi.dll版本:%d.%d.%d", 0
g_szNeedIE5    db "自动完成功能需要使用IE5以上版本", 0 
g_FailLoadDLL db "不能装载"
g_szShlwapiDLL db "shlwapi.dll", 0
g_FailGetProcAddr    db "不能获取函数"
g_szDllGetVersion    db "DllGetVersion", 0
g_szSHAutoComplete    db "SHAutoComplete", 0


.data?
g_hInstance    HINSTANCE ?
g_hWndMain    HANDLE ?
g_hEditDemo    HANDLE ?
g_hCkbOpen    HANDLE ?
g_Buf1        db 256 dup (?)
g_dvi        DLLVERSIONINFO <>
g_lpfnDllGetVersion    DWORD ?
g_lpfnSHAutoComplete    DWORD ?
g_hDll        HANDLE ?


.code
start:
    invoke GetModuleHandle, NULL
    mov    g_hInstance, eax
    invoke LoadLibrary, ADDR g_szShlwapiDLL
    mov g_hDll, eax
    .if eax==NULL
        xor eaxeax
        jz @F 
    .endif

    invoke GetProcAddress, g_hDll, ADDR g_szDllGetVersion
    .if eax==NULL    
        xor eaxeax
        jz @FreeDll 
    .endif
    mov g_lpfnDllGetVersion, eax

    invoke GetProcAddress, g_hDll, ADDR g_szSHAutoComplete
    .if eax==NULL    
        xor eaxeax
        jz @FreeDll 
    .endif
    mov g_lpfnSHAutoComplete, eax

    invoke WinMain, g_hInstance, NULL, NULL, SW_SHOWDEFAULT
@FreeDll:
    invoke FreeLibrary, g_hDll
@@:
    invoke ExitProcess, eax


WinMain proc hInst: DWORD, hPrevInst: DWORD, CmdLine: DWORD, CmdShow: DWORD
    LOCAL wc: WNDCLASSEX
    LOCAL msg: MSG
    LOCAL hwnd: HWND

    m_m2m  wc.cbSize, SIZEOF WNDCLASSEX
    m_m2m  wc.style, CS_HREDRAW or CS_VREDRAW
    m_m2m  wc.lpfnWndProc, OFFSET WndProc
    m_m2m  wc.cbClsExtra, NULL
    m_m2m  wc.cbWndExtra, NULL
    m_m2m  wc.hInstance, g_hInstance
    m_m2m  wc.hbrBackground, COLOR_APPWORKSPACE
    m_m2m  wc.lpszMenuName, NULL   ;IDR_MAINMENU
    m_m2m  wc.lpszClassName, OFFSET g_szClsName
    invoke LoadIcon, NULL, IDI_APPLICATION
    mov   wc.hIcon, eax
    mov   wc.hIconSm, eax
    invoke LoadCursor, NULL, IDC_ARROW
    mov   wc.hCursor, eax
    invoke RegisterClassEx, addr wc
    invoke CreateWindowEx, WS_EX_TOPMOST, ADDR g_szClsName, ADDR g_szAppName,\
           WS_OVERLAPPEDWINDOW+WS_VISIBLE, CW_USEDEFAULT,\
           CW_USEDEFAULT, c_WinWidth, c_WinHeight, NULL, NULL,\
           hInst, NULL
    mov hwnd, eax
    .while TRUE
        invoke GetMessage, ADDR msg, NULL, 0, 0
        .BREAK .IF (!eax)
        invoke TranslateMessage, ADDR msg
        invoke DispatchMessage, ADDR msg
    .endw
    mov eax, msg.wParam
    ret
WinMain endp


WndProc proc hWnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM
    .if uMsg==WM_CREATE
        m_m2m g_hWndMain, hWnd
        ; Create demo editbox
        ;--------------------------
        invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr g_szEditCls, NULL,\
            WS_CHILD + WS_VISIBLE + ES_AUTOHSCROLL,\
            c_EditDemoLeft, c_EditDemoTop, c_EditDemoWidth, c_EditDemoHeight, hWnd, IDC_EdtCmd, g_hInstance, NULL
                mov g_hEditDemo, eax

        ; Create autocheckbox
        ;--------------------------
        invoke CreateWindowEx, NULL, addr g_szBtnCls, addr g_szCkbOpenText,\
            WS_CHILD+WS_VISIBLE+BS_AUTOCHECKBOX, c_CkbOpenLeft, c_CkbOpenTop, c_CkbOpenWidth, c_CkbOpenHeight,\
            hWnd, IDC_CkbOpen, g_hInstance, NULL
        mov g_hCkbOpen, eax

        ; Get the version of Shlwapi.dll
        ;--------------------------
        m_m2m g_dvi.cbSize, SIZEOF g_dvi
        ;invoke DllGetVersion, addr g_dvi
        push OFFSET g_dvi
        call g_lpfnDllGetVersion
        .if eax != 0
            invoke MessageBox, hWnd, ADDR g_szFailGetVerNo, ADDR g_szAppName, MB_ICONERROR+MB_OK
              xor eaxeax
            jz @F
        .endif

        invoke wsprintf, ADDR g_Buf1, ADDR g_szVerFmt, g_dvi.dwMajorVersion, g_dvi.dwMinorVersion, g_dvi.dwBuildNumber
        invoke SetWindowText, g_hEditDemo, ADDR g_Buf1

        .if g_dvi.dwMajorVersion < 5
            invoke MessageBox, hWnd, ADDR g_szNeedIE5, ADDR g_szAppName, MB_ICONERROR+MB_OK
@@:
            invoke PostQuitMessage, NULL
            ret
        .endif

        invoke CoInitialize, NULL

    .elseif uMsg==WM_COMMAND
        .if lParam!=0
            mov eax, wParam
            .IF ax==IDC_CkbOpen
                shr eax, 16 
                        .if ax==BN_CLICKED
                            invoke SendMessage, g_hCkbOpen, BM_GETCHECK, NULL, NULL

                            ;invoke SHAutoComplete, g_hEditDemo, SHACF_DEFAULT
                            .if eax==BST_CHECKED
                                push SHACF_DEFAULT
                            .else
                                push SHACF_AUTOSUGGEST_FORCE_OFF+SHACF_FILESYSTEM+SHACF_URLALL
                            .endif
                            push g_hEditDemo
                            call g_lpfnSHAutoComplete

                            .if eax!=0
                                invoke MessageBox, hWnd, ADDR g_szFailOpen, addr g_szAppName, MB_ICONERROR+MB_OK
                                xor eaxeax
                                jz @B
                            .endif
                            invoke SetFocus, g_hEditDemo
                        .endif
            .ENDIF
        .endif
    .elseif uMsg==WM_DESTROY
        invoke CoUninitialize
        invoke PostQuitMessage, NULL
    .else
        invoke DefWindowProc, hWnd, uMsg, wParam, lParam        
        ret
    .endif
    xor eaxeax
    ret
WndProc endp

end start
查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
        邮件订阅

        如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

        重磅专题
        往期文章
        最新文章