WIN32汇编语言教程:第15章 注册表和INI文件 · 15.2 INI文件的操作(2)

{

 RTEXT "Section", -1, 4, 7, 30, 8

 EDITTEXT IDC_SEC, 39, 5, 78, 12, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP

 RTEXT "Key", -1, 4, 23, 30, 8

 EDITTEXT IDC_KEY, 39, 21, 78, 12, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP

 RTEXT "Value", -1, 4, 39, 30, 8

 EDITTEXT IDC_VALUE, 39, 37, 78, 12, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP

 LTEXT "当前 INI 文件内容:", -1, 8, 57, 141, 8

 EDITTEXT IDC_INI, 6, 71, 232, 91, ES_MULTILINE | ES_AUTOVSCROLL |

    ES_AUTOHSCROLL | ES_READONLY | WS_BORDER | WS_VSCROLL | WS_TABSTOP

 PUSHBUTTON "删除 &Section", IDC_DEL_SEC, 122, 4, 57, 14

 PUSHBUTTON "删除 K&ey", IDC_DEL_KEY, 183, 4, 57, 14

 PUSHBUTTON "读取 &Key", IDC_GET_KEY, 122, 20, 57, 14

 PUSHBUTTON "保存 Ke&y", IDC_SET_KEY, 183, 20, 57, 14

}

//##################################################################

汇编源文件Ini.asm的内容如下:

                .386

             .model flat, stdcall

             option casemap :none

;####################################################################

; Include 文件定义

;####################################################################

include       windows.inc

include       user32.inc

includelib    user32.lib

include       kernel32.inc

includelib    kernel32.lib

;####################################################################

; Equ 等值定义

;####################################################################

ICO_MAIN          equ    1000

DLG_MAIN          equ    1000

IDC_SEC       equ    1001

IDC_KEY       equ    1002

IDC_VALUE     equ    1003

IDC_INI       equ    1004

IDC_DEL_SEC    equ    1005

IDC_DEL_KEY    equ    1006

IDC_GET_KEY    equ    1007

IDC_SET_KEY    equ    1008

;####################################################################

; 数据段

;####################################################################

                .data?

hInstance     dd    ?

hWinMain          dd    ?

szProfileName  dd    MAX_PATH dup (?)

szBuffer1     db    32760 dup (?)

szBuffer2     db    32760 dup (?)

                .const

szFileName    db    '\Option.ini',0

szSecPos          db    'Windows Position',0

szKeyX        db    'X',0

szKeyY       db    'Y',0

szFmt1       db    '%d',0

szFmtSection      db    '[%s]'

szCrLf        db    0dh,0ah,0

;####################################################################

; 代码段

;####################################################################

                .code

;####################################################################

; 枚举全部 Section 和全部 Key

;####################################################################

_EnumINI          proc

                 local  @szBuffer[256]:byte

 

                invoke SetDlgItemText,hWinMain,IDC_INI,NULL

;********************************************************************

; 读取 Section 列表并循环处理

;********************************************************************

                invoke GetPrivateProfileSectionNames,addr szBuffer1,\

                       sizeof szBuffer1,addr szProfileName

             mov    esi,offset szBuffer1

             .while byte ptr [esi]

                       invoke  wsprintf,addr @szBuffer,addr szFmtSection,esi

                        invoke SendDlgItemMessage,hWinMain,IDC_INI,\

                               EM_REPLACESEL,FALSE,addr @szBuffer

;********************************************************************

; 读取 Key 列表并循环显示

;********************************************************************

                        invoke  GetPrivateProfileSection,esi,addr szBuffer2,\

                                sizeof szBuffer2,addr szProfileName

                        mov    edi,offset szBuffer2

                        .while byte ptr [edi]

                               invoke SendDlgItemMessage,hWinMain,\

                                       IDC_INI,EM_REPLACESEL,FALSE,edi

                                invoke  SendDlgItemMessage,hWinMain,IDC_INI,\

                                       EM_REPLACESEL,FALSE,addr szCrLf

                                invoke lstrlen,edi

                             add    edi,eax

                             inc    edi

                     .endw

                     invoke lstrlen,esi

                     add    esi,eax

                     inc    esi

             .endw

             ret

 

_EnumINI         endp

;####################################################################

_GetPosition      proc

                 local  @szBuffer[512]:byte

;********************************************************************

; 将当前路径和 ini 文件名组合起来

;********************************************************************

                invoke GetCurrentDirectory,MAX_PATH,addr szProfileName

                mov    esi,offset szProfileName

             invoke lstrlen,esi

             mov    ecx,offset szFileName

             .if    byte ptr [esi+eax-1] == '\'

                     inc    ecx

             .endif

             invoke lstrcat,esi,ecx

;********************************************************************

; 读存放在 ini 文件中的数据

;********************************************************************

             invoke GetPrivateProfileInt,addr szSecPos,\

                     addr szKeyX,50,addr szProfileName

             push      eax

             invoke GetPrivateProfileInt,addr szSecPos,\

                     addr szKeyY,50,addr szProfileName

             pop ecx

             invoke  SetWindowPos,hWinMain,HWND_TOP,ecx,eax,0,0,SWP_NOSIZE

                ret

 

_GetPosition      endp

;####################################################################

_SavePosition  proc

             local  @szBuffer[512]:byte,@szRect:RECT

上页:第15章 注册表和INI文件 · 15.2 INI文件的操作(1) 下页:第15章 注册表和INI文件 · 15.2 INI文件的操作(3)

第15章 注册表和INI文件

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号