Profil de MoodskyMoodsky's Programing Spa...PhotosBlogListes Outils Aide

Moodsky

Photo 1 sur 6
La liste est vide.
La liste est vide.
20/02/2006

[推荐]Visual Studio 2005.NET系列全部下载

cs_vs_2005_vsts_trial_dvd.iso.torrent
Microsoft Visual Studio 2005 Team Edition(含MSDN).torrent
Microsoft.SQL.Server.2005.简体中文开发版.torrent
SQL Server 2005 Enterprise Edition - 32-bit - CD1 (Simplified Chinese).torrent
SQL Server 2005 Enterprise Edition - 32-bit - CD2 (Simplified Chinese).torrent
SQL Server 2005 Enterprise Edition - 64-bit Extended - CD1 (Simplified Chinese).torrent
SQL Server 2005 Enterprise Edition - 64-bit Extended - CD2 (Simplified Chinese).torrent
Visio2005.for.VS2005.简体中文正式版.torrent
Visual Basic 2005 Express Edition ISO(繁体中文).torrent
Visual.Studio2005.Msdn简体中文正式版.torrent
Visual.Studio2005_Pro简体中文正式版.torrent
Visual.Veb.Devloper.2005速成版中文正式版.torrent
 
下载:
18/02/2006

[OCN]破解组织KeyGen模板

;###########################################################
.586
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\comctl32.inc
include \masm32\include\shell32.inc
include minifmod.inc
includelib \masm32\lib\user32.lib 
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comctl32.lib
includelib \masm32\lib\shell32.lib
includelib minifmod.lib
;###########################################################
;%%%%%%%%%%%%%%%%%%%%
; 对话框过程定义
;%%%%%%%%%%%%%%%%%%%%
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
;%%%%%%%%%%%%%%%%%%%%
; 常数定义
;%%%%%%%%%%%%%%%%%%%%
.const
DLG_MAIN       equ 102
DLG_ABOUT      equ 104
IDI_ICON       equ 103
IDM_MUSIC      equ 101
IDC_REG        equ 1001
IDC_ABOUT      equ 1003
IDC_WEB1       equ 1010
IDC_WEB2       equ 1011
IDC_EMAIL      equ 1012
IDC_OK         equ 1013
IDE_NAME       equ 1000
IDE_SN         equ 1002
;%%%%%%%%%%%%%%%%%%%%
; 变量定义
;%%%%%%%%%%%%%%%%%%%% 
.data
handleIcon dd 0
handleEdit dd 0
szFormat db "%1d",0
szOpen db "open", 0
szSoftAdd db "
http://spaces.msn.com/moodsky/",0 ; 在这里定义IDC_WEB2
szOCNadd db "
http://www.chinaocn.net",0 ; 在这里定义IDC_WEB2
szEmail db "
mailto:moodsky@eyou.com",0 ; 在这里定义IDC_EMAIL
szNameBuffer db 50 dup(0)
szSnBuffer db 50 dup(0)
szBuffer db 100 dup(0)
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
pMusic LPVOID ?
nMusicSize DWORD ?
 
;###########################################################
.code
start:
    ;%%%%%%%%%%%%%%%%%%%%
    ; 建立对话框
    ;%%%%%%%%%%%%%%%%%%%%
    invoke InitCommonControls ; 初始化自定义控制库
    invoke GetModuleHandle,NULL ; 获取当前模块句柄
    mov hInstance,eax
    push esi
    invoke FindResource, hInstance, IDM_MUSIC, RT_RCDATA
    push eax
    invoke SizeofResource, hInstance, eax
    mov nMusicSize, eax
    pop eax
    invoke LoadResource, hInstance, eax
    invoke LockResource, eax
    mov esi, eax
    mov eax, nMusicSize
    add eax, SIZEOF nMusicSize
    invoke GlobalAlloc, GPTR, eax
    mov pMusic, eax
    mov ecx, nMusicSize
    mov dword ptr [eax], ecx
    add eax, SIZEOF nMusicSize
    mov edi, eax
    rep movsb
    pop esi
   
    invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,OFFSET DlgProc,FALSE ; 显示定义的对话框
    invoke GlobalFree, pMusic
    invoke ExitProcess,NULL
;%%%%%%%%%%%%%%%%%%%%
; 关于对话框过程
;%%%%%%%%%%%%%%%%%%%%
AboutProc proc hAWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    .IF uMsg==WM_CLOSE
 invoke EndDialog,hAWin,NULL
 ret
    .ELSEIF uMsg==WM_INITDIALOG
        ;%%%%%%%%%%%%%%%%%%%%
        ; 对话框初始化消息
        ; 设置标题栏的图标
        ;%%%%%%%%%%%%%%%%%%%%
        invoke SetWindowPos,hAWin,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE
    .ELSEIF uMsg==WM_COMMAND
        ;%%%%%%%%%%%%%%%%%%%%
        ; 按钮消息处理
        ;%%%%%%%%%%%%%%%%%%%%
 mov eax,wParam
 .IF ax == IDC_WEB1
 ;%%%%%%%%%%%%%%%%%%%%
        ; 软件下载地址按钮
        ;%%%%%%%%%%%%%%%%%%%%
     invoke ShellExecute,NULL,OFFSET szOpen,OFFSET szSoftAdd,NULL,NULL,SW_SHOWNORMAL
 .ELSEIF ax == IDC_WEB2
 ;%%%%%%%%%%%%%%%%%%%%
        ; 我的论坛地址按钮
        ;%%%%%%%%%%%%%%%%%%%%
     invoke ShellExecute,NULL,OFFSET szOpen,OFFSET szOCNadd,NULL,NULL,SW_SHOWNORMAL
        .ELSEIF ax == IDC_EMAIL
 ;%%%%%%%%%%%%%%%%%%%%
        ; 邮件地址按钮
        ;%%%%%%%%%%%%%%%%%%%%
     invoke ShellExecute,NULL,OFFSET szOpen,OFFSET szEmail,NULL,NULL,SW_SHOWNORMAL
        .ELSEIF ax == IDC_OK
 ;%%%%%%%%%%%%%%%%%%%%
        ; OK按钮
        ;%%%%%%%%%%%%%%%%%%%%
            invoke EndDialog,hAWin,NULL
     ret
 .ENDIF
    .ELSE
 mov eax,FALSE
 ret
    .ENDIF
    mov eax,TRUE
    ret
AboutProc endp
;%%%%%%%%%%%%%%%%%%%%
; 主对话框过程
;%%%%%%%%%%%%%%%%%%%%
DlgProc proc hWin:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    mov eax,uMsg
    .IF eax == WM_CLOSE
        ;%%%%%%%%%%%%%%%%%%%%
        ; 点击"x"按钮
        ;%%%%%%%%%%%%%%%%%%%%
 invoke mfmPlay, 0
 invoke EndDialog,hWin,NULL
    .ELSEIF eax == WM_INITDIALOG
        ;%%%%%%%%%%%%%%%%%%%%
        ; 对话框初始化消息
        ; 设置标题栏的图标
        ;%%%%%%%%%%%%%%%%%%%%
        invoke LoadIcon,hInstance,IDI_ICON
        mov handleIcon, eax
        invoke SendMessage,hWin,WM_SETICON,1,handleIcon
        invoke SetWindowPos,hWin,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE
 xor eax,eax
        invoke mfmPlay, pMusic
        invoke SetFocus, eax
    .ELSEIF eax == WM_COMMAND
        ;%%%%%%%%%%%%%%%%%%%%
        ; 按钮消息处理
        ;%%%%%%%%%%%%%%%%%%%%
        mov eax,wParam
        .IF eax == IDC_REG
            ;%%%%%%%%%%%%%%%%%%%%
            ; 点击"注册"按钮
            ;%%%%%%%%%%%%%%%%%%%%
            .IF
     .ELSE
     .ENDIF
 .ELSEIF eax == IDC_ABOUT
     ;%%%%%%%%%%%%%%%%%%%%
            ; 点击"关于"按钮
            ;%%%%%%%%%%%%%%%%%%%%
     invoke CreateDialogParam,hInstance,DLG_ABOUT,hWin,offset AboutProc,FALSE
     invoke EnableWindow,hWin,0
 .ENDIF
    .ELSE
 mov eax,FALSE
 ret
    .ENDIF
    mov eax,TRUE
    ret
DlgProc endp
end start
;###########################################################
 
源程序下载:[下载后请将*.htm扩展名去掉]
 
 
 
09/02/2006

Win32Asm快速教程笔记整理

05/02/2006

自定义 DialogBox 基本操作

Basics.inc

include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.inc
includelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.lib
DlgProc   PROTO :HWND,:UINT,:WPARAM,:LPARAM
.const
IDD_DIALOG1   equ 101
 
;#########################################################################
.data
NewCaption  db 'Hello World',0
sTitle   db 'Messagebox',0
.data?
hInstance  dd ?
hBtn   dd ?
;#########################################################################
 
 
 
Basics.asm
 
.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive
include Basics.inc
.code
start:
 invoke GetModuleHandle,NULL ;获取当前模块句柄
 mov    hInstance,eax        ;保存在hInstance
        invoke InitCommonControls   ;初始化自定义控制库
 invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL ;显示定义的对话框
 invoke ExitProcess,0        ;退出进程
;########################################################################
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM ;对话框过程
LOCAL buffer[64]:BYTE
 mov eax,uMsg
 .if eax==WM_INITDIALOG ;对话框初始化消息
  invoke GetDlgItem,hWin,1002 ;获取控件IDC_BTN2指针
  mov hBtn,eax
  
 .elseif eax==WM_COMMAND
  mov  eax,wParam
  ;通報訊息,也就是將特定的訊息(已經預先定義好)附加在WM_COMMAND訊息中的wParam參數的高字組,
  ;用來進一步區分產生WM_COMMAND訊息的控制項以及觸發的事件。
  mov  edx,eax
  shr  edx,16     ;逻辑右移
  and  eax,0FFFFh ;高位清零,变为按钮标识
  .if edx==BN_CLICKED
   .if eax==1001      ;IDC_BTN1
    invoke SetWindowText,hWin,offset NewCaption ;Set dialog caption
   .elseif eax==1002  ;IDC_BTN2
    invoke EnableWindow,hBtn,0                  ;Disable this button
   .elseif eax==1003  ;IDC_BTN3
    invoke EnableWindow,hBtn,1                  ;Enable upper button
   .elseif eax==1004  ;IDC_BTN4
    invoke SendDlgItemMessage,hWin,1005,WM_SETTEXT,0,offset NewCaption        ;Change caption of static
   .elseif eax==1007  ;IDC_BTN5
    invoke SendDlgItemMessage,hWin,1006,WM_GETTEXT,sizeof buffer,addr buffer  ;Change the editbox text
    invoke MessageBox,hWin,addr buffer,offset sTitle,MB_OK                    ;
    invoke SendDlgItemMessage,hWin,1006,WM_SETTEXT,0,offset NewCaption        ;
   .endif
  .endif
 .elseif eax==WM_CLOSE ;关闭消息
  invoke EndDialog,hWin,0 ;关闭对话框
 .else
  mov  eax,FALSE
  ret
 .endif
 mov  eax,TRUE
 ret
DlgProc endp
end start
;说明:
;SendMessage(hwnd, BN_CLICKED, wParam, lParam)
;wParam的16位为按钮的ID,lParam为按钮的句柄
;SendMessage(hwnd, BN_CLICKED, MAKELONG(ID_YOURBTN,0), hYourBtn);
 
 
03/02/2006

Oep Finder V1.0 by Human/MiNT 代码粗略分析

.586p
.model flat,stdcall
option casemap:none
include  e:\archives\masm32\include\comctl32.inc
include  e:\archives\masm32\include\comdlg32.inc
include  e:\archives\masm32\include\kernel32.inc
include  e:\archives\masm32\include\user32.inc
include  e:\archives\masm32\include\windows.inc
includelib e:\archives\masm32\lib\comctl32.lib
includelib e:\archives\masm32\lib\comdlg32.lib
includelib e:\archives\masm32\lib\kernel32.lib
includelib e:\archives\masm32\lib\user32.lib
b equ byte ptr ;常熟定义
w equ word ptr
d equ dword ptr
q equ qword ptr
f equ fword ptr
o equ offset
IDD_DIALOG equ 100
BTN_FILE equ 110
BTN_OEP  equ 111
BTN_EXIT equ 112
IDC_FILE equ 120
IDC_EDIT1 equ 121
IDC_EDIT2 equ 122
IDC_CHECK equ 130
EXCEPTION_GUARD_PAGE EQU 080000001h
DlgProc  proto :dword,:dword,:dword,:dword
.data? ;变量定义
context  CONTEXT <> ;线程的上下文结构
ofn  OPENFILENAME <> ;打开文件对话框信息结构
sinfo  STARTUPINFO <> ;进程的启动信息结构
pinfo  PROCESS_INFORMATION <> ;进程结构信息
ldte  LDT_ENTRY <> ;LDT_ENTRY类型
dbevent  DEBUG_EVENT <> ;DEBUG_EVENT结构
fs30  dd ? ;[fs:30]
buffer  db 512 dup (?)
hInst  dd ?
hIcon  dd ?
basestart dd ?
baseend  dd ?
range  dd ?
empty  dd ?
pehdr  db 1024 dup (?)
oeptext  db 9 dup (?)
edit1  db 9 dup (?)
edit2  db 9 dup (?)
zero  db ?
faster  db ?
counter  db ?
.data
assume cs:nothing
filterstring db "exe files",0,"*.exe",0,"all files",0,"*.*",0,0
oepcapt  db "Oep is:",0
.code
start:
 invoke InitCommonControls
 ;该函数允许应用程序装载和初始化选择的公共控件
 invoke GetModuleHandle,0 
 ;获取应用程序的句柄
 mov [hInst],eax          
 ;返回句柄保存在[hInst]
 invoke LoadIcon,[hInst],900
 ;从指定的应用程序实例中载入一个图标
 mov [hIcon],eax            
 ;返回已载入的图标的句柄保存在[hIcon]
 invoke DialogBoxParam,[hInst],IDD_DIALOG,0,o DlgProc,0
 ;显示定义的对话框,这个对话框要在资源中存在
 invoke ExitProcess,0 ;中止进程
 
DlgProc proc,hDlg:dword,uMsg:dword,wParam:dword,lParam:dword
 mov eax,[uMsg]
 cmp eax,WM_INITDIALOG ;
 jne initiated
 invoke SendMessage,[hDlg],WM_SETICON,1,[hIcon]    
 ;设置对话框图标
 invoke CheckDlgButton,[hDlg],IDC_CHECK,BST_CHECKED
 ;改变按钮控制的选中状态
 ;BST_CHECKED(选中),BST_UNCHECKED(非选中)
initiated:
 cmp eax,WM_CLOSE      ;窗口关闭消息
 je _wmclose           ;等于则跳_wmclose
 cmp eax,WM_COMMAND    ;菜单命令消息
 jne maybe_move        ;不等则跳maybe_move
 cmp [wParam],BTN_FILE ;&File 按钮
 je get_file           ;
 cmp [wParam],BTN_OEP  ;&Oep 按钮
 je find_oep           ;
 cmp [wParam],BTN_EXIT ;&Exit 按钮
 je _wmclose
maybe_move:
 cmp eax,WM_LBUTTONDOWN ;按下鼠标左键消息
 jne unknown
 invoke SendMessage,[hDlg],WM_NCLBUTTONDOWN,HTCAPTION,0
 ;在标题栏非客户区按鼠标左键
unknown:
 xor eax,eax
 ret
 
_wmclose:
 invoke EndDialog,[hDlg],0 ;关闭对话框
 jmp unknown
 
get_file:
 mov [ofn.lStructSize],sizeof ofn    
 ;指定这个结构的大小,以字节为单位
 mov [ofn.lpstrFilter],o filterstring
 ;过滤器,最后一个字符串必须以两个NULL字符结束
 mov [ofn.lpstrFile],o buffer        
 ;初始化文件名
 mov [ofn.nMaxFile],512              
 ;lpstrFile的大小
 mov [ofn.Flags],OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES
 ;用来初始化对话框
 invoke GetOpenFileName,o ofn        
 ;调用打开文件对话框
 or eax,eax
 je unknown
 invoke SetDlgItemText,[hDlg],IDC_FILE,o buffer
 ;设置文本框内容
 invoke CreateFile,o buffer,GENERIC_READ,0,0,OPEN_EXISTING,20h,0
 ;对文件进行读访问
 push eax
 invoke ReadFile,eax,o pehdr,1024,o empty,0
 ;读文件头1024个字节,保存在offset pehdr
 pop eax
 invoke CloseHandle,eax ;关闭文件句柄
 mov ebx,o pehdr        ;地址入ebx
 add ebx,[ebx+3ch]      ;_lfanew
 mov eax,[ebx+34h]      ;----------------
 add eax,[ebx+104h]     ;这段程序写的不是很明白
 mov [basestart],eax    ;应该是寻找程序的VA
 mov ebx,[ebx+100h]     ;作者写为
 mov [range],ebx        ;add edx,[edx.IMAGE_DOS_HEADER.e_lfanew]
 add eax,ebx            ;mov eax,[edx.IMAGE_NT_HEADERS.OptionalHeader.ImageBase]
 mov [baseend],eax      ;的形式会容易被理解些
 mov ebx,[basestart]    ;
 mov ecx,8              ;
 mov edi,o edit1+7      ;
 call hex               ;转换为16进制
 mov ebx,[range]        ;
 mov ecx,8              ;
 mov edi,o edit2+7      ;
 call hex               ;------------------
 invoke SetDlgItemText,[hDlg],IDC_EDIT1,o edit1 ;设置文本框内容
 invoke SetDlgItemText,[hDlg],IDC_EDIT2,o edit2 ;设置文本框内容
 jmp unknown
 
find_oep:
 invoke IsDlgButtonChecked,[hDlg],IDC_CHECK
 ;得到复选框IDC_CHECK的值
 mov [faster],al
 ;值入[faster]
 invoke GetStartupInfo,o sinfo
 ;获取进程的启动信息
 invoke CreateProcess,o buffer,0,0,0,0,DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS,0,0,o sinfo,o pinfo
 ;只调试当前过程
 or eax,eax
 je unknown
 .while TRUE
 invoke WaitForDebugEvent,o dbevent,-1

 ;等待调试事件
 ;这个函数和其他的WaitForXXX函数相似,比如说,它阻塞调用线程直到等待的事件发生.
 ;对这个函数来说,它等待由Windows发送的调试事件.在我们的程序中做对调试事件的响应.
 ;当WaitForDebugEvent 返回时,这意味着在debuggee进程中发生了调试事件或者发生了超时.
 ;所以我们的程序要检查dwDebugEventCode 来作出适当的反应.
 ;这里有些象处理Windows消息:由用户来选择和忽略消息.
 
 .if [dbevent.dwDebugEventCode]==EXIT_PROCESS_DEBUG_EVENT
 ;进程退出,dwDebugEventCode 该值指定了等待发生的调试事件的类型
 invoke ContinueDebugEvent,dbevent.dwProcessId,dbevent.dwThreadId,DBG_CONTINUE
 ;继续运行debuggee
 .break
 .elseif [dbevent.dwDebugEventCode]==CREATE_PROCESS_DEBUG_EVENT
 ;进程被创建.当debuggee进程刚被创建(还未运行)
 ;或我们的程序刚以DebugActiveProcess被捆绑到一个运行中的进程时事件发生.
 ;这是我们的程序应该获得的第一个事件.
 mov [context.ContextFlags],CONTEXT_FULL
 ;表示全模式读写,
 ;相当于CONTEXT_CONTROL or CONTEXT_INTEGER or CONTEXT_SEGMENTS,
 ;即这三个标志的组合.
 invoke GetThreadContext,pinfo.hThread,o context
 ;得到指定线程的上下文结构
 invoke GetThreadSelectorEntry,pinfo.hThread,context.regFs,o ldte
 ;记录程序的flat程序代码区和数据区
 mov ah,[ldte.HighWord1.Bytes.BaseHi]                            
 ;转换选择子 fs 为线性地址
 mov al,[ldte.HighWord1.Bytes.BaseMid]
 shl eax,16
 mov ax,[ldte.BaseLow]
 add eax,30h
 ;配合下句,读取[fs:30]的值
 invoke ReadProcessMemory,pinfo.hProcess,eax,o fs30,4,0
 ;读4byte
 mov eax,[fs30]
 ;[fs:30]入eax,地址传地址
 add eax,2 ;eax+2
 invoke WriteProcessMemory,pinfo.hProcess,eax,o zero,1,0
 ;写入1byte
 invoke VirtualProtectEx,pinfo.hProcess,basestart,range,PAGE_EXECUTE_READWRITE or PAGE_GUARD,o empty
 ;修改basestart前range长度字节的属性
 .elseif [dbevent.dwDebugEventCode]==LOAD_DLL_DEBUG_EVENT
 ;debuggee装入一个DLL
 invoke VirtualProtectEx,pinfo.hProcess,basestart,range,PAGE_EXECUTE_READWRITE or PAGE_GUARD,o empty
 ;修改basestart前range长度字节的属性
 .elseif [dbevent.dwDebugEventCode]==EXCEPTION_DEBUG_EVENT
 ;在debuggee中发生异常时事件发生
 .if [dbevent.u.Exception.pExceptionRecord.ExceptionCode]==EXCEPTION_BREAKPOINT
 invoke VirtualProtectEx,pinfo.hProcess,basestart,range,PAGE_EXECUTE_READWRITE or PAGE_GUARD,o empty
 ;修改basestart前range长度字节的属性
 .elseif [dbevent.u.Exception.pExceptionRecord.ExceptionCode]==EXCEPTION_GUARD_PAGE
 ;由Virtual Alloc建立起来的属性页冲突
 cmp [faster],0  ;比较faster复选框的值
 je do_guard     ;没选中则跳
 inc [counter]   ;+1
 and [counter],3 ;
 cmp [counter],0 ;
 jne no_guard    ;
do_guard:
 invoke VirtualProtectEx,pinfo.hProcess,basestart,range,PAGE_EXECUTE_READWRITE or PAGE_GUARD,o empty
 ;修改basestart前range长度字节的属性
no_guard:
 invoke GetThreadContext,pinfo.hThread,o context
 ;得到指定线程的上下文结构
 mov ebx,[context.regEip] ;
 cmp ebx,[basestart]
 jb no_oep
 cmp ebx,[baseend]
 ja no_oep
 mov ecx,8 ;个数
 mov edi,o oeptext+7
 call hex
 invoke MessageBox,[hDlg],o oeptext,o oepcapt,0 ;oep信息框
 invoke VirtualProtectEx,pinfo.hProcess,basestart,range,PAGE_EXECUTE_READWRITE,o empty
 ;修改basestart前range长度字节的属性
no_oep:
 invoke ContinueDebugEvent,dbevent.dwProcessId,dbevent.dwThreadId,DBG_CONTINUE
 ;继续运行debuggee
 .continue
 .endif
 .endif
 invoke ContinueDebugEvent,dbevent.dwProcessId,dbevent.dwThreadId,DBG_EXCEPTION_NOT_HANDLED
 .endw ;对应.while TRUE
 invoke CloseHandle,pinfo.hProcess ;关闭进程
 invoke CloseHandle,pinfo.hThread  ;关闭线程
 jmp unknown
DlgProc endp
 
hex:
 mov eax,ebx ;16进制转换
 and al,0fh
 add al,90h
 daa
 adc al,40h
 daa
 shr ebx,4
 mov [edi],al
 dec edi
 dec ecx
 jne hex
 ret
end start
 
 
 
 

;下面是几个类型定义
;**********************************************************
CONTEXT STRUCT
  ContextFlags  DWORD      ?
  iDr0          DWORD      ?
  iDr1          DWORD      ?
  iDr2          DWORD      ?
  iDr3          DWORD      ?
  iDr6          DWORD      ?
  iDr7          DWORD      ?
  FloatSave     FLOATING_SAVE_AREA <>
  regGs         DWORD      ?
  regFs         DWORD      ?
  regEs         DWORD      ?
  regDs         DWORD      ?
  regEdi        DWORD      ?
  regEsi        DWORD      ?
  regEbx        DWORD      ?
  regEdx        DWORD      ?
  regEcx        DWORD      ?
  regEax        DWORD      ?
  regEbp        DWORD      ?
  regEip        DWORD      ?
  regCs         DWORD      ?
  regFlag       DWORD      ?
  regEsp        DWORD      ?
  regSs         DWORD      ?
  ExtendedRegisters db MAXIMUM_SUPPORTED_EXTENSION dup(?)
CONTEXT ENDS
;**********************************************************
OPENFILENAMEA STRUCT
  lStructSize        DWORD      ?
  hwndOwner          DWORD      ?
  hInstance          DWORD      ?
  lpstrFilter        DWORD      ?
  lpstrCustomFilter  DWORD      ?
  nMaxCustFilter     DWORD      ?
  nFilterIndex       DWORD      ?
  lpstrFile          DWORD      ?
  nMaxFile           DWORD      ?
  lpstrFileTitle     DWORD      ?
  nMaxFileTitle      DWORD      ?
  lpstrInitialDir    DWORD      ?
  lpstrTitle         DWORD      ?
  Flags              DWORD      ?
  nFileOffset         WORD      ?
  nFileExtension      WORD      ?
  lpstrDefExt        DWORD      ?
  lCustData          DWORD      ?
  lpfnHook           DWORD      ?
  lpTemplateName     DWORD      ?
OPENFILENAMEA ENDS
OPENFILENAME  equ  <OPENFILENAMEA>
;**********************************************************
STARTUPINFOA STRUCT
  cb              DWORD ?
  lpReserved      DWORD ?
  lpDesktop       DWORD ?
  lpTitle         DWORD ?
  dwX             DWORD ?
  dwY             DWORD ?
  dwXSize         DWORD ?
  dwYSize         DWORD ?
  dwXCountChars   DWORD ?
  dwYCountChars   DWORD ?
  dwFillAttribute DWORD ?
  dwFlags         DWORD ?
  wShowWindow     WORD ?
  cbReserved2     WORD ?
  lpReserved2     DWORD ?
  hStdInput       DWORD ?
  hStdOutput      DWORD ?
  hStdError       DWORD ?
STARTUPINFOA ENDS
STARTUPINFO equ <STARTUPINFOA>
;**********************************************************
PROCESS_INFORMATION STRUCT
  hProcess      DWORD      ?
  hThread       DWORD      ?
  dwProcessId   DWORD      ?
  dwThreadId    DWORD      ?
PROCESS_INFORMATION ENDS
;**********************************************************
LDT_ENTRY STRUCT
    LimitLow dw ?
    BaseLow  dw ?
    union HighWord1
        Bytes LDT_BYTES <>
        Bits LDTBits <>
    ends
LDT_ENTRY ENDS
;**********************************************************
DEBUG_EVENT STRUCT
  dwDebugEventCode  DWORD       ?
  dwProcessId       DWORD       ?
  dwThreadId        DWORD       ?
  u                 DEBUGSTRUCT <>
DEBUG_EVENT ENDS
;**********************************************************
 

14/12/2005

消息过滤

过滤消息又称为消息陷阱。用户可能需要屏蔽某系消息或截获某些消息进行处理。消息过滤一般有三种途径:

重载构件继承的虚拟方法wndproc。
◇ 针对某消息编写消息处理句柄。
◇ 重载构件继承的虚拟方法DefauleHandler,在其中对消息进行处理。

常用的是第2种方法,在上节已经介绍,第1种方法与第3种使用相似,重载虚拟方法wndproc的一般过程:

procedure TMyObject.wndproc(var message:TMessage);
begin
  {...判断此消息是否该处理}
  inherited wndproc(message);
  {未处理的消息交由父辈wndproc方法处理}

end;

可以看出,在wndproc方法处理消息的优势是可以过滤整个范围内的消息,而不必为每个消息指定一个处理句柄,事实上TControl构件中就是利用它来过滤并处理所有的鼠标消息(从WM_MOUSEFIRST到WM_MOUSELAST)同样利用它可以阻止某些消息被发送给处理句柄。

procedure TControl.Wndproc(var message:TMessage);
begin
  if (message.msg>=WM_MOUSEFIRST) and (message.msg<=WM_MOUSELAST) then
    if Dragging then{处理拖拽事件}
      DragMouseMsg(TWMMouse(message))
    else
      {处理其他鼠标消息}
  else
    Dispatch(message);
    {否则正常发送消息}
end;

一个完整的例子:

unit myEdit;
interface
uses
Windows,messages,sysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;
type
  Tmyedit=class(Tedit)
  private
  {private declarations}
  protected
  {protected declarations}
  {other fields and methods}
    procedure wndproc(var message:Tmessage);override;
  public
  {public declarations}
  published
  {published declarations}
  end;

procedure Register;
implementation

procedure Register;
begin
  RegisterComponents('Samples',[Tmyedit]);
end;

procedure Tmyedit.wndproc(var message:Tmessage);
bigin
  if message.msg=WM_MOUSEMOVE then
  begin
    cursor:=crarrow;
    {设置光标为crarrow,而不是缺省光标}
    exit;
  end;
  if message.msg=WM_SetFocus then
  exit;
  {屏蔽掉WM_SetFocus,不让组件获得焦点}
  inherited wndproc(message);
  {其他消息交父辈处理}
end;
end.

消息处理

所谓消息处理,就是应用程序以某种方式响应Windows消息。在Delphi中,每个消息都有各自的过程,这些用于消息处理的过程必须满足3个条件:

◇ 这个过程必须是一个对象中的方法。
◇ 这个过程必须有一个var参数,变量的类型是TMessage或其他特殊的消息记录。
◇ 声明这个过程时,必须使用message指示符,后面是要处理的消息的常量值。

下面是一个处理WM_PAINT消息的过程的代码:

procedure WMPaint(var mMsg:TWMPaint);message:WM_PAINT;

然后在单元的Implementation部分实现这个过程。

procedure TForm1.WMPaint(var Msg:TWMPaint);
begin
  Beep;
  Inherited;
end;

上述代码中的Inherited语句将传递消息给祖先对象,也就是把消息传递给TForm中处理WM_PAINT消息的过程。

UINT RegisterWindowMessage(lpsz)

函数说明:RegisterWindowMessage函数定义一个新的窗口消息,该消息保证在整个系统范围内是唯一的。调用SendMessage或PostMessage函数时可以使用该函数返回的消息值。
参数说明: lpsz
  指向一个以NULL结束的字符串,该字符串指定待登记的消息。
返回值:若成功地登记了消息,返回值是一个消息标识符。该标识符值的范围在0XC000到0XFFFF之间,否则,返回值为0。
注释:RegisterWindowMessage函数通常用于为两个合作应用程序之间的通信登记消息。
  若两个不同的应用程序登记了相同的消息字符串,则这两个应用程序返回相同的消息值。该消息一直维持被登记状态,直到Windows会话结束。当多个应用程序必须处理同一消息时才使用RegisterWindowMessage函数。在一个窗口类范围内发送私有消息时,应用程序可使用范围在WM_USER到0X7FFF之间的任意整数。

Windows发送消息的方式

(1)VCL的Perform()适用于所有TControl派生对象。只要知道Form或组件的实例,Perform()可以发送消息给任何一个Form或组件。
(2)SendMessage()和PostMessage()函数是Windows中两个发送消息的API函数,SendMessage()直接把一个消息发送给窗口程序并等消息处理完之后返回,PostMessage()只是把消息发送给消息队列,然后立即返回,并不要知道消息是否处理完。

两个API的参数是一致的。参数hWnd指接收消息的窗口句柄;参数Msg指消息标识符;参数Wparam指32位的特定附加信息;参数Lparam指32位的特定附加信息。

(一)在程序内部发送消息:

Const WM_MYMESSAGE=WM_USER+200;
Begin
SomeForm.perform(WM_MYMESSAGE,0,0);
//或者
SendMessage(SomeForm.handle,WM_MYMESSAGE,0,0);
//或者
PostMessage(SomeForm.handle,WM_MYMESSAGE,0,0);

然后定义一个消息处理过程,处理WM_MYMESSAGE消息

private
procedure doMyMessage(var msg:TMessage);message WM_MYMESSAGE;
end;

procedure Tform.doMyMessage(var Msg:TMessage);
begin
  //作想要的处理
end;

(二)在应用程序之间发送消息:

最好调用RegisterWindowMessage()函数,这个函数能够确保每个应用程序使用一致的消息序号。

(三)广播消息

TWinControl的派生对象可以调用Broadcast()向它的子组件广播一个消息,当需要向一组组件发送相同的消息时,便可以使用这种技术。例如,Panel1可以给它的所有子组件发送一个叫UM_FOO的自定义消息:

var
  M:TMessage;
begin
  with M do
  begin
    msg:=UM_FOO;
    wParam:=0
    lParam:=0;
    Result:=0;
  end;
  panel1.Broadcast(M);
end;

还可以利用SendMessage()和PostMessage()函数,需要把hWnd参数设置为HWND_BROADCAST,它代表向所有的窗口发送消息。

SendMessage(HWND_BROADCAST,FMessageID,0,0);

VCL 的消息处理原理

每个VCL 组件都有内在的消息处理机制,在建立一个窗体或加入一个组件时,VCL 就已经注册了一个消息接受例程MainWndProc,这个例程是每个窗体和组件所固有的。Delphi内部使用这个例程接收来自各方面的消息并把它们发送给适当的处理方法,如果没有特定的处理方法,则调用缺省的消息处理句柄。

MainWndProc 不直接处理消息,也不能被重载,而是交由WndProc 方法处理并提供异常保护。WndProc 是在TControl类中定义的一个虚拟方法,可覆盖,可以对自己关心的消息进行截获、处理,提供自定义的消息处理例程。对于不处理的要调用继承让父类去处理,这也是非常好的编程习惯。WndProc 调用Dispatch方法进行消息分配,而Dispatch方法将根据消息号码调用组件的最后继承类中处理此消息的句柄方法。如果此组件和它的祖先类中都没有对应此消息的处理句柄,Dispatch方法便会调用DefauleHandler方法。DefauleHandler方法是定义于Tobject中的虚拟方法,它只实现简单的返回而不对消息进行任何处理。我们可以通过此虚拟方法的重载,在子类中实现对消息的缺省处理。

Tobject.Dispatch派发消息时是按照继承链逆流而上的。首先找本类中用Message定义的消息处理方法,如果覆盖的话,则调用它来处理,如果没有就继续查找父类。首先从Message定义方法查起,然后再看看DefauleHandler中是否覆盖,这样一直找到TObject的DefauleHandler,在Tobject.DefauleHandler中什么都不处理,只是走到了消息处理的尽头。

窗口响应消息的步骤

从消息的产生到消息被一个窗口响应,这其中要经历5 个步骤:

(1)系统中发生了某个事件。
(2)Windows 把这个事件翻译成消息,然后把它放到消息队列中。
(3)应用程序从消息队列中接收这个消息,并把它存放在TMsg纪录中。
(4)应用程序把消息传递给一个适当的窗口过程。
(5)窗口过程响应这个消息并进行处理。

步骤(3)(4)构成了应用程序的消息循环。

Windows的消息系统的组成

Windows的消息系统由以下3部分组成:

◇ 消息队列:Windows 能够为所有的应用程序维护一个消息队列,应用程序必须从消息队列中获取消息,然后分派给某个窗口。
◇ 消息循环:通过这个循环机制,应用程序从消息队列中检索消息,再把它分派给适当的窗口,然后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。
◇ 窗口过程:每个窗口都有一个窗口过程,以接收Windows 传递给窗口的消息,窗口过程的任务就是获取消息并且响应它。窗口过程是一个回调函数,处理完一个消息后,通常要给Windows 一个返回值。

15/10/2005

MapX学习(7)

Layers.CreateLayer 方法

CreateLayer 方法允许您创建新的临时或永久 MapInfo 表图层。创建的表具有一个用于图元名的列,由标记和数据绑定使用。在添加或更新图元时,Name 属性将置于图元名称列中。
 
语法
[Layer=]OBJECT.CreateLayer (Name , [FileSpec] , [Position] , [KeyLength] , [CoordSys])
 
部分 说明
OBJECT Layer 集合对象。
Name 引用图层所用的名称(图层的用户名)。
FileSpec Variant:创建图层位置的路径名。文件名应该包括 .tab 扩展名。构成 MapInfo 表(.map、.dat 等)的其他文件在 .tab 文件所在的同一目录中创建。如果没有给定文件名,则将创建临时图层,该图层在地图销毁时删除。
Position Variant:图层列表中的初始位置。如果忽略,则字段图层定位算法将基于图层的类型指定图层顺序。
KeyLength Variant:添加到保存图元名称的表的列的长度。如果忽略,则默认为 32。
CoordSys Variant:CoordSys 对象,指定存储新图层的坐标系。可选;如果省略,则使用 Map.NumericCoordSys 属性。

注解
该方法返回 Layer 对象,添加到集合的 Layer 对象。新图层使用名为 GEONAME 的关键字列创建。
 
Dim lyr As MapXLib.Layer
' 创建作为动画图层的临时图层
' 置于图层列表中的第一个位置,并使用默认关键字长度
Set lyr = Map1.Layers.CreateLayer("tempAnimate", ,1)
Set Map1.Layers.AnimationLayer = lyr
 
Map.SaveMapAsGeoset 方法

此方法创建 geoset 文件,表示地图的当前状态(图层信息,标记设置等)。
 
语法
OBJECT.SaveMapAsGeoset  (name, filespec)
 
部分 说明
OBJECT 一个 Map 对象。
name 表示 geoset 友好名称的字符串(出现在 Geodictionary 中的描述)。如果指定空字符串,则将会使用地图的标题。
filespec 表示用于 geoset 文件的完全文件路径的字符串。如果没有指定路径,则新文件将置于数据目录中。如果没有指定扩展名,则将使用标准的 .gst 扩展名。如果指定文件已存在,则将会被覆盖。
 
注解
如果地图包含任意临时图层、用户绘制图层,或通过 miLayerInfoTypeServer 添加的远程图层,则相应图层将置于新的 geoset 文件之外,并且将会保存(在保存 geoset 之后)。通过 .tab 文件添加的远程图层将保存在结果 geoset 之内。如果地图中没有图层,则此方法还将报错。此外,形状文件 (*.shp) 不得保存到 geoset。
 
Visual Basic 示例
Map1.SaveMapAsGeoset "My latest map", "C:\Data\Most Recent.GST"
Delphi 示例
Map1.SaveMapAsGeoset('My latest map', 'C:\Data\Most Recent.GST');
 
 

MapX学习(6)

检查图层类型
 
Dim lyr as Layer
For Each lyr in Map1.Layers
Select Case lyr.Type
Case miLayerTypeNormal
  MsgBox “Layer ” & lyr.Name & “ is a normal layer”
Case miLayerTypeRaster
  MsgBox “Layer ” & lyr.Name & “ is a raster layer”
Case miLayerTypeSeamless
  MsgBox “Layer ” & lyr.Name & “ is a seamless layer”
Case miLayerTypeUnknown
  MsgBox “Layer ” & lyr.Name & “ is an unknown layer”
Case miLayerTypeUserDraw
  MsgBox “Layer ” & lyr.Name & “ is a user draw layer”
Case miLayerTypeDrilldown
  MsgBox “Layer ” & lyr.Name & “ is a drilldown layer”
Next

在该代码片断中,我们将使用 MapX 定义的常数用于所有图层类型。这些常数统称LayerTypeConstants。
 
检查图元类型
 
Dim i as Integer
For i = 1 To Map1.Layers.Count
Select Case Map1.Layers(i).PredominantFeatureType
Case miFeatureTypeRegion
  MsgBox "Layer " & lyr.Name & " contains regions"
Case miFeatureTypeLine
  MsgBox "Layer " & lyr.Name & " contains lines"
Case miFeatureTypeSymbol
  MsgBox "Layer " & lyr.Name & " contains symbols"
Case miFeatureTypeUnknown
  MsgBox "Layer " & lyr.Name & " contains unknown _
features"
Case miFeatureTypeText
  MsgBox "Layer " & lyr.Name & "contains text features"
End Select
Next

Layer 集合具有一个基础索引,以便我们可从一个索引值开始按照 Layer 集合计数来进行迭代。我们还评估集合中每个图层的 PredominantFeatureType 属性,使用 FeatureType 常数来评估PredominantFeatureType。
 
以下示例代码向使用 Layer 集合的地图添加了图层。通过修改 Layer 对象属性来添加方法和设置缩放图层。
Dim lyrStreets As Layer
`Creates the layer object
`Sets the Streets table as the layer object and orders the layer in
`themap as number 3.
Set lyrStreets = Map1.Layers.Add(“treets.tab”, 3)
lyrStreets.ZoomLayer = True
`Sets zoom layering to true
lyrStreets.ZoomMin = 0 `Sets minimum zoom to 0 miles
lyrStreets.ZoomMax = 5
`Sets maximum zoom to 5 miles
在设置某一图层的缩放图层之后,当您在缩放级别上、下限进行缩放时,图层将显示在地图之上。您还可以使用缩放工具或地图对象的 ZoomTo 方法来地图上进行放大。使用 ZoomTo 方法,您可以指定缩放级别以及 x 和 y 坐标来确定地图中心。
Map1.ZoomTo 3, -70.26, 44.05
由于 3 英里的缩放值在缩放级别的限定值之内,因此 Streets 图层将以 (-70.26, 44.05) 的点为中心,然后在地图控制的宽度之内显示 3 英里的地图。
 
 
14/10/2005

MapX学习(5)

某些 Layer 属性
 
Layer 对象代表采用地图图元形式的矢量制图数据,具有主要的图元类型,例如区域、直线或符号。通常 Layer 对象相应于源自 MapInfo 表的地理对象。Layer 集合中的每个 Layer 对象的行为相互独立。其样式和其缩放图层可以基于单独的基础更改,图层之间互不影响。
 
AutoLabel
控制图层是否自动标记。“States”
Map1.Layers(“tates”).AutoLabel = True
 
Name
图层的名称。
MsgBox Map1.Layers(4).Name
 
OverrideStyle
是否覆盖此图层的默认显示特征。
Map1.Layers(9).OverrideStyle = True
 
Selectable
将 MapX 设置为识别用户何时单击此图层。
Map1.Layers(”tates”).Selectable = True
 
Style
OverrideStyle 为 True 时要使用的图层样式。
Map1.Layers(9).Style = newstyleobject
 
Visible
图层是否可见。
Map1.Layers.Item(2).Visible = False
 
ZoomLayer
将缩放图层设置为开或闭。
Map1.Layers(“tates”).ZoomLayer = True
 
ZoomMax
设置图层可见的最大缩放级别。
Map1.Layers(“tates”).ZoomMin = 580
 
ZoomMin
设置图层可见的最小缩放图层。
Map1.Layers(”tates”).ZoomMin = 45
 
Layer 集合中的地图图层按照增序索引显示(例如 Layers(1) 是顶层, Layers(2) 是 Layer(1) 之下的图层),底层最先绘制,顶层最后绘制。正确设定图层顺序非常重要。