首页
社区
课程
招聘
[旧帖] [求助]罗云彬win32第一个窗口程序中的问题 0.00雪花
发表于: 2012-4-17 11:54 1738

[旧帖] [求助]罗云彬win32第一个窗口程序中的问题 0.00雪花

2012-4-17 11:54
1738
请教大家关于罗云彬win32第一个窗口程序中的问题
看完书后,自己尝试写了一个出现一个问题,
1、就是程序运行了但看不到界面,在任务管理器又可以看到进程,
2、还有就是代码中:hInstance和hwinmain有什么区别啊,
3、在注册窗口类时:
push hInstance
POP @stWndClass.hInstance
这二句为什么不能换成mov @stWndClass.hInstance,hInstance
4、在定义数据时
hwinmain        dd        ?
hInstance dd (?)
加括号和不加括号都可以,他们是一样的么?

下面是代码
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
.386
.model flat,stdcall
option casemap:none

;include定义

include windows.inc
include user32.inc
includelib user32.lib
include gdi32.inc
includelib gdi32.lib
include kernel32.inc
includelib kernel32.lib

;数据段

                        .data?
hwinmain        dd        ?
hInstance dd (?)
                        .const
szCaption        db        '第一个自己写的win32窗口程序',0
szText                db        '我是第一个win32程序',0
                       

;代码段

.code

;窗口过程

_prowinmain        proc        uses        ebx edi esi,hWnd,umsg,wparam,lparam
        mov eax,umsg
        .if eax==WM_CLOSE
                invoke DestroyWindow,hwinmain
                invoke        PostQuitMessage,NULL
        .else
                invoke DefWindowProc,hWnd,umsg,wparam,lparam
                ret
        .endif
        xor eax,eax
        ret
_prowinmain        endp

;窗口建立

_winmain        proc
                local        @stWndClass:WNDCLASSEX
                local @stMSG:MSG
                invoke        GetModuleHandle,NULL
                mov hInstance,eax
                invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
                invoke LoadCursor,0,IDC_ARROW
                mov @stWndClass.hCursor,eax
                mov @stWndClass.cbSize,sizeof WNDCLASSEX
                push hInstance
                POP @stWndClass.hInstance
                mov @stWndClass.lpfnWndProc,offset _prowinmain
                mov @stWndClass.lpszClassName,offset szCaption
                mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
                mov @stWndClass.hbrBackground,COLOR_WINDOW+1
                invoke RegisterClassEx,addr @stWndClass
                invoke CreateWindowEx,WS_EX_CLIENTEDGE,\
                                        offset szText,offset szCaption,\
                                        WS_OVERLAPPEDWINDOW,\
                                        100,100,600,400,\
                                        NULL,NULL,hInstance,NULL
                mov hwinmain,eax
               
                invoke ShowWindow,hwinmain,SW_SHOWNORMAL
                invoke UpdateWindow,hwinmain

;消息循环

        .while TRUE
                invoke GetMessage,addr @stMSG,NULL,0,0
                .BREAK .if eax==0
       
        invoke TranslateMessage,addr @stMSG
        invoke DispatchMessage,addr @stMSG
        .endw
_winmain endp

;程序入口

start:
        call _winmain
        invoke ExitProcess,NULL
end start
       
               
麻烦大家帮下忙,谢谢

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
mov @stWndClass.hInstance,hInstance 貌似不允许这么写
hInstance 实例句柄
hwinmain 主窗口句柄
2012-4-17 23:10
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
1. 没有调用BeginPaint, 当然没有窗口...貌似是这个原因
在你的_Procwinmain函数里面加上
.if eax == WM_PAINT
invoke BeginPaint, hWnd, addr @stPs
mov @hDc, eax
invoke GetClientRect, hWnd, addr @stRect
invoke DrawText, @hDc, addr szText -1, addr @stRect, DT_SINGLELINE or DT_CENTER   or DT_VCENTER(这里你自己注意一下分行了)
invoke EndPaint,hWnd, addr @stPs

问题出在调用ShowWindow时候返回的消息你的程序没有正确处理....

我也是菜鸟,不知道分析的对不对。

hInstance 和 hwinmain不一样...
2012-4-18 20:58
0
雪    币: 506
活跃值: (65)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看反汇编的代码,看不懂,
一直想用汇编写一段时间的程序唉、
2012-4-18 21:48
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
不用调用BeginPaint也会有窗口的,我看了一下,可能是lpszClassName不能用中文
2012-4-18 21:49
0
雪    币: 57
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主:

在注册窗口类时:
push hInstance
POP @stWndClass.hInstance
这二句为什么不能换成mov @stWndClass.hInstance,hInstance

你有没有考虑过MOV 指令的作用与限制?

我记得MOV的用法是从寄存器< ——>内存地址的传递,当然还是立即数
好像直接内存 <-->内存的传递都是由中间寄存器来的传递

   如        mov  eax,A内存
              mov  B内存,eax

    或 就是使用上面的方法通过堆来交换台 push  / pop

你再查查MOV指令的用法分析一下,,我也没太注意这点,只是用多了形成了一个习惯。
~_~

hwinmain  dd  ?
hInstance dd (?)  

正确的语法是  hInstance dd    100 dup (?)
个人理解        hInstance dd    1 dup (?)  等于 hInstance dd    (?)     

不知是否有帮助!
2012-4-20 13:54
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我也在看这里.我说的不一定对,都是在我理解的基础上.我一点基础都没有.呵呵,就用"新手"的角度回答吧,一起学习

1、就是程序运行了但看不到界面,在任务管理器又可以看到进程,
答:
A.资源.rc文件中定义可能有错误.检查#define与工程文件中的EUQ ID是否相对应
B.hwinmain这个窗口句柄没有正确被注册

2、还有就是代码中:hInstance和hwinmain有什么区别啊,
答:
A:以书上为例,hInstance是通过GetMoudelHeader获得的应用程序句柄,当invoke
GetMoudelHeader,NULL时,返回的是这个应用程序实例的句柄,返回值在EAX中.下一行紧接着是mov hInstance,eax.
也就是说,你在.data?区定义了一个全局的变量,通过mov hInstance,eax保存了这个应用程序句柄.这个 hInstance 以我的理解是给系统调用或者使用的.尤其是在退出程序时,需要用到这个句柄.
B.hwinmain用书上的例子说,是窗口句柄,参照上面理解就行.以我现在新手的角度来说,这个hWinMain窗口句柄在应用程序窗口,创建,注册,显示,刷新的时候需要用到他.如果系统没有获得这个hWinMain句柄,那么以上这些操作,系统会找不到.
3、在注册窗口类时:
push hInstance
POP @stWndClass.hInstance
这二句为什么不能换成mov @stWndClass.hInstance,hInstance
答:这个是属于基本的知识,呵呵,我这里也理解了好半天.对寄存器赋值那里(王爽的PDF中有答案)

4、在定义数据时
hwinmain  dd  ?
hInstance dd (?)
加括号和不加括号都可以,他们是一样的么?
答:第一个定义是对的,意思是说,定义这个变量的时候就进行初始化
第二个定义有错误 (?) 不可以用在这样的定义中.我也不明白..只是说在初始化一块内存区域的时候,比如说数组.这么来用

我太菜了..当做你参考吧.但是别完全信..
2012-4-20 17:51
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
mov @stWndClass.lpszClassName,offset szCaption
楼主真有才,把窗口标题当类名赋进去了,szCaption是窗口标题吧?
2012-7-5 00:15
0
游客
登录 | 注册 方可回帖
返回
//