首页
社区
课程
招聘
[旧帖] [求助]EnumWindows为什么要出错 0.00雪花
发表于: 2009-8-28 14:10 4210

[旧帖] [求助]EnumWindows为什么要出错 0.00雪花

2009-8-28 14:10
4210
目的是找出所有:无标题 - 记事本 的hand.发送到列表框中,然后在列表框中双击其中一项,出现一个对话框, 点确定,就出问题,出现内存不能为write。为什么点确定要出问题呢?
原码:
.386
                .model flat, stdcall
                option casemap :none
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib

IDD_DLG         equ        1000
IDC_list         equ        1001

.data?
hinstance        dd        ?
hand                dd        ?
ttt                dd        ?

.data
fmat        db        'hand=%d',0
find1        db        '无标题 - 记事本',0
.code

_enum        proc        uses        ebx esi edi hwnd,lparam
        LOCAL @buffer[256]:byte
       
        invoke GetWindowText,hwnd,addr @buffer,sizeof @buffer
        invoke lstrcmp,addr @buffer,addr find1
        ;只找记事本
        .if !eax
                invoke wsprintf,addr @buffer,addr fmat,hwnd
                invoke SendDlgItemMessage,hand,IDC_list ,LB_ADDSTRING,0,addr @buffer
                invoke SendDlgItemMessage,hand,IDC_list,LB_SETITEMDATA,eax,hwnd
        .endif
       
       
        ret

_enum endp
_start        proc        _tt
       
        invoke        EnumWindows,_enum,NULL
        ret
_start endp

_dlgproc        proc  uses ebx esi edi hdlg,umsg,wparam,lparam
        LOCAL @buffer
        mov eax,umsg
        .if eax==WM_CLOSE
                invoke EndDialog,hdlg,NULL                               
        .elseif eax==WM_INITDIALOG
                push hdlg
                pop  hand
                push ecx
                invoke CreateThread,NULL,0,addr _start,NULL,NULL,esp
                pop  ecx
                invoke CloseHandle,eax               
        .elseif eax==WM_COMMAND       
       
                mov eax,wparam
                ;只处理列表框上的双击
                shr eax,16
                .if ax== LBN_DBLCLK                       
                        invoke SendDlgItemMessage,hdlg,IDC_list,LB_GETCURSEL,0,0                               
                        invoke SendDlgItemMessage,hdlg,IDC_list,LB_GETITEMDATA,eax,0
                        invoke wsprintf,addr @buffer,addr fmat,eax
                        invoke MessageBox,NULL,addr @buffer,NULL,MB_OK                       
                .endif       
       
        .else
                mov eax,FALSE
                ret                               
        .endif       
        mov eax,TRUE               
        ret
_dlgproc endp

start:

invoke GetModuleHandle,NULL
mov hinstance,eax
invoke DialogBoxParam,hinstance,IDD_DLG,NULL,offset _dlgproc,NULL
invoke ExitProcess,NULL
end start

资源为
#include <resource.h>
#define IDD_DLG1 1000
#define IDC_list 1001

IDD_DLG1 DIALOGEX -2,-13,255,138
CAPTION "测试"
FONT 8,"MS Sans Serif",0,0,0
STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW
EXSTYLE WS_EX_TOOLWINDOW
BEGIN
  CONTROL "",IDC_list,"ListBox",WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_NOINTEGRALHEIGHT|LBS_HASSTRINGS|LBS_NOTIFY,36,24,177,63,WS_EX_CLIENTEDGE
END

在WM_INITDIALOG那只写上
invoke SendDlgItemMessage,hand,IDC_list ,LB_ADDSTRING,0,addr find1
                invoke SendDlgItemMessage,hand,IDC_list,LB_SETITEMDATA,eax,10
都没有问题

帮忙调试一下

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
2
新手路过.帮顶
2009-8-28 15:20
0
雪    币: 198
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
高手出来说说吗?
2009-8-28 19:42
0
雪    币: 450
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
枚举过程应该返回BOOL值,TRUE表示继续枚举,FALSE则表示出错或停止.
具体来说,添个返回值就OK了.
2009-8-28 20:26
0
雪    币: 198
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我添加了,没用。
我又测试了一下,是INDEX出错,INDEX好像不能超过100.
2009-8-28 20:48
0
雪    币: 450
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
MessageBox的第二个参数竟然是NULL,你的标题好具欺骗性,只是访问空指针而已,汗~~~
2009-8-28 21:01
0
游客
登录 | 注册 方可回帖
返回
//