首页
社区
课程
招聘
[旧帖] [求助]子程序无法改变全局变量。 0.00雪花
发表于: 2013-3-26 08:51 1897

[旧帖] [求助]子程序无法改变全局变量。 0.00雪花

2013-3-26 08:51
1897
求解,为什么_KenInitdial执行完之后,无法正确保存hDest,当执行子程序BT_ReadInfo,hDest是另外一个值?如何正确改变全局变量或传递结果?

                .386
                .model flat, stdcall
                option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_Main         equ        1000
IDB_1                equ        1
GB_GameInfo         equ        1001
GB_WinInfo         equ        1002
STC_Table         equ        1003
STC_Seat         equ        1004
BT_SelTable         equ        1005
BT_SelSeat         equ        1006
ED_TableInfo         equ        1007
ED_SeatInfo         equ        1008
BT_GameStart         equ        1009
STC_X                 equ        1010
STC_Y                 equ        1011
ED_X                 equ        1012
ED_Y                 equ        1013
BT_ReadInfo         equ        1014
BT_Initdial         equ        1015
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data?
hInstance        dd                ?
szBuffer        dd                ?
hDest                dd                ?;保存目标句标
stDestRect        RECT                <>;保存目标坐标

                .const
szDestCap        db                '无标题 - 记事本',0;目标标题
szMeDestFind        db                'The handle you are finding is %x',0
szShow                db                '这是:%x',0
szMeCap                db                '123',0
fmtRect                db                '%d',0;坐标格式化
szNotFound        db                'Receive Message Window not found!',0
intRealX        equ                655
intRealY        equ                568
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_KenInitdial        proc        _hWnd,_lpszDestCap,_BT_Initdial
                ;找到目标窗口,保存目标句柄,更改对话框标题
                pushad

                invoke        FindWindow,NULL,_lpszDestCap
                .if        eax
                        mov        hDest,eax
                        invoke         SetWindowText,_hWnd,addr szDestCap
                        invoke        GetDlgItem,_hWnd,_BT_Initdial
                        invoke        EnableWindow,eax,FALSE
                .else       
                        invoke        MessageBox,NULL,offset szNotFound,offset szMeCap,MB_OK
                .endif
               
                popad
                ret

_KenInitdial endp
_GameStart        proc        _hWnd,_stDestRect:RECT,_intRealX,_intRealY
               
                LOCAL        @GameStartRect:RECT
                pushad
                mov        eax,_stDestRect.left
                add        eax,_intRealX
                mov        @GameStartRect.left,eax
                mov        eax,_stDestRect.top
                add        eax,_intRealY
                mov        @GameStartRect.top,eax
                invoke         SetCursorPos,@GameStartRect.left,@GameStartRect.top
                popad
                ret

_GameStart endp
_ProcDlgMain        proc        uses ebx edi esi hWnd,wMsg,wParam,lParam

                mov        eax,wMsg
                .if        eax == WM_CLOSE
                        invoke        EndDialog,hWnd,NULL
                .elseif        eax == WM_INITDIALOG
                                ;invoke        LoadIcon,hInstance,ICO_MAIN
                                ;invoke        SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
                .elseif        eax == WM_COMMAND
                        mov        eax,wParam
                        .if        ax == IDOK
                                invoke        EndDialog,hWnd,NULL
                        .elseif        ax == BT_Initdial
                                ;找到目标窗口,保存句柄,更改对话框标题
                                invoke        _KenInitdial,hWnd,addr szDestCap,BT_Initdial
                                invoke        UpdateWindow,hWnd                               
                        .elseif        ax == BT_ReadInfo                               
                                ;读取目标窗口坐标,并显示                       
                                invoke        GetWindowRect,hDest,offset stDestRect
                                invoke        wsprintf,addr szBuffer,addr fmtRect,stDestRect.left
                                invoke        MessageBox,NULL,offset szBuffer,offset szMeCap,MB_OK
                                invoke        SetDlgItemText,hWnd,ED_X,addr szBuffer
                                invoke        wsprintf,addr szBuffer,addr fmtRect,stDestRect.top
                                invoke        MessageBox,NULL,offset szBuffer,offset szMeCap,MB_OK
                                invoke        SetDlgItemText,hWnd,ED_Y,addr szBuffer
                                invoke        UpdateWindow,hWnd
                        .elseif        ax == BT_GameStart
                                ;开始游戏
                                invoke        _GameStart,hWnd,stDestRect,intRealX,intRealY               
                        .endif
                .else
                        mov        eax,FALSE
                        ret
                .endif
                mov        eax,TRUE
                ret

_ProcDlgMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
                invoke        GetModuleHandle,NULL
                mov        hInstance,eax
                invoke        DialogBoxParam,hInstance,DLG_Main,NULL,offset _ProcDlgMain,NULL
                invoke        ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                end        start

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 1121
活跃值: (742)
能力值: ( LV5,RANK:66 )
在线值:
发帖
回帖
粉丝
2
你确定你正确的拿到句柄了么?再有,既然用汇编了,何不用OD调试一遍看看到底哪的问题。
2013-3-26 10:35
0
雪    币: 102
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
句柄是正确的。只是执行完之后,hDest就变了。。
2013-3-26 10:52
0
雪    币: 30
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
没有细看, 经验觉得是溢出了
2013-5-7 14:31
0
游客
登录 | 注册 方可回帖
返回
//