win32第一个程序,在线求问
为什么两个都是自己定义的子程序,_ProcWinMain要声明参数, _WinMain proc为却不需要声明, ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; Sample code for < Win32ASM Programming 2nd Edition>
; by 罗云彬, http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; FirstWindow.asm
; 窗口程序的模板代码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff FirstWindow.asm
; Link /subsystem:windows FirstWindow.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
.const
szClassName db 'MyClass',0
szCaptionMain db 'My first Window !',0
szText db 'Win32 Assembly, !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<span style="background-color: red;">_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam</span>
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
mov eax,uMsg
;********************************************************************
.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
;********************************************************************
.elseif eax == WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
;********************************************************************
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;********************************************************************
xor eax,eax
ret
_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<span style="background-color: red;">_WinMain proc</span>
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
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
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
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
.data
AppLoadMsgTitle db"装载应用程序", 0
AppLoadMsgTextdb"收到WM_CREATE消息", 0
PopupTitle db"弹出窗口", 0
PopupText db"您已经按下鼠标左键", 0
GreetTitle db"主窗口激活", 0
GreetText db"将显示主窗口", 0
CloseMsg db"收到WM_CLOSE消息", 0
CloseWinMsg db"关闭窗口", 0
ErrorTitle db"错误", 0
WindowName db"鱼C工作室(www.fishc.com)Win32案例演示程序"
ClassName db"类名", 0
MainWin WNDCLASS <CS_HREDRAW or CS_VREDRAW,\
WinProc,\
NULL,\
NULL,\
NULL,\
NULL,\
NULL,\
COLOR_WINDOW+1,\
NULL,\
ClassName>
msg MSG <> ; 消息结构
winRect RECT <>; 矩形坐标结构
hMainWnd dd? ; 主窗口的句柄
hInstance dd? ; 模块的句柄
.code
WinMain PROC ; 主程序入口点
invokeGetModuleHandle, NULL ; 获取本模块句柄
mov hInstance, eax
mov MainWin.hInstance, eax
invoke LoadIcon, NULL, IDI_APPLICATION; 载入图标并填充
mov MainWin.hIcon, eax
invoke LoadCursor, NULL, IDC_ARROW ; 载入鼠标光标并填充
mov MainWin.hCursor, eax
invoke RegisterClass, addr MainWin ; 注册窗口
.if eax == 0
call ErrorHandler ; 显示错误信息,该过程在后边定义
jmp Exit_Program
.endif
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset ClassName,offset WindowName,\
WS_OVERLAPPEDWINDOW,\
100,100,600,400,\
NULL,NULL,hInstance,NULL
mov hMainWnd, eax
.if eax == 0
call ErrorHandler
jmp Exit_Program
.endif
invoke ShowWindow, hMainWnd, SW_SHOW
invoke UpdateWindow, hMainWnd
invoke MessageBox,
hMainWnd,
addr GreetText,
addr GreetTitle,
MB_OK
@@:
invoke GetMessage, ; 从消息队列取消息
addr msg, ; 传入待填充的消息结构的地址
NULL, ; NULL代表要取本程序所属的窗口的消息
NULL,
NULL
.if eax == 0 ; 没有获得消息
jmp Exit_Program
.endif
invoke DispatchMessage,
addr msg
jmp @B
Exit_Program:
invoke ExitProcess, 0
WinMain ENDP
WinProc PROC, hWnd:DWORD, localMsg:DWORD, wParam:DWORD, lParam:DWORD
mov eax, localMsg
.if eax == WM_LBUTTONDOWN
invoke MessageBox, hWnd, addr PopupText, addr PopupTitle, MB_OK
jmp WinProcExit
.elseif eax == WM_CLOSE
invoke MessageBox, hWnd, addr CloseMsg, addr CloseWinMsg, MB_OK
invoke PostQuitMessage, 0
jmp WinProcExit
.elseif eax == WM_CREATE
invoke MessageBox, hWnd, addr AppLoadMsgText, addr AppLoadMsgTitle, MB_OK
jmp WinProcExit
.else
invoke DefWindowProc, hWnd, localMsg, wParam, lParam
jmp WinProcExit
.endif
WinProcExit:
ret
WinProc ENDP
ErrorHandler PROC
local pErrorMsg:DWORD
local messageID:DWORD
invoke GetLastError
mov messageID, eax
invoke FormatMessage,
FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
messageID,
NULL,
addr pErrorMsg,
NULL,
NULL
invoke MessageBox, NULL, pErrorMsg, addr ErrorTitle, MB_ICONERROR + MB_OK
invoke LocalFree, pErrorMsg
ret
ErrorHandler ENDP
END WinMain
这是基于win32汇编的一个窗口代码,求最佳答案{:5_110:} 楼主代码乱了哦 楼主这个帖子的内容属于汇编windows程序设计,不知道我可以解决的了吗。明天给你看看 是不是和函数放的位置有关,把被调用的函数过程写在调用这个函数之前试一试。 freeparty 发表于 2015-4-17 22:36
楼主代码乱了哦
那我重新发给你吧,其实我是不理解,为什么同样都是子程序,也就是_ProcWinMain和_WinMain这两个用户定义的函数,前者是按照书上说的,后面带了许多参数_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam;;;;;;;;也就是所谓的声明,另一个_WinMain则没有按照书上子程序的
的定义方式,
我之前想可能是因为_WinMain不是子程序,然后上网自己查了,然后看都有人写了,_WinMain也是用户定义的子程序,然后我蛋疼了;
我语文是体育老师教的,不知道这样表述你能不能清楚我问的
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 2nd Edition>
; by 罗云彬, http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; FirstWindow.asm
; 窗口程序的模板代码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff FirstWindow.asm
; Link /subsystem:windows FirstWindow.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
.const
szClassName db 'MyClass',0
szCaptionMain db 'My first Window !',0
szText db 'Win32 Assembly, !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
mov eax,uMsg
;********************************************************************
.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
;********************************************************************
.elseif eax == WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
;********************************************************************
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;********************************************************************
xor eax,eax
ret
_ProcWinMain 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
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
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
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
freeparty 发表于 2015-4-17 22:47
是不是和函数放的位置有关,把被调用的函数过程写在调用这个函数之前试一试。
这是从网上找的注释;
_ProcWinMain proc uses ebx edi esi,hWnd,uMsg,wParam,lparam ;定义_ProcWinMain子程序.保存ebx,edi,esi的值,uMsg参数,指定的消息有一定的范围,wParam,lparam参数是消息所附带的参数,它随消息的不同而不同,
_WinMain proc ;定义子程序名为_WinMain
都是子程序,为什么一个遵从书上子程序的定义,另个貌似不用遵循; 逆流杀 发表于 2015-4-17 23:27
这是从网上找的注释;
最简单实用的方法就是拿C写一个窗口,然后调试的时候看一下反汇编代码 freeparty 发表于 2015-4-19 17:12
这是基于win32汇编的一个窗口代码,求最佳答案
看的出来,版主很用心,辛苦了,但我还是想说,我不是想要源代码,我只是纠结,为什么,_ProcWinMain 后面有这些东西proc uses ebx edi esi,hWnd,uMsg,wParam,lparam 这些参数;而——WinMain proc 后面没有这些玩意,不管怎么说,还是谢谢版主的解答,辛苦了,我自己再慢慢往后面看看,可能以后就会懂了,谢谢了 本帖最后由 santaclaus 于 2015-4-20 01:02 编辑
因为一个消息的回调函数,一个是win32程序入口函数,都是函数,但系统要求的形参不同! santaclaus 发表于 2015-4-20 00:55
因为一个消息的回调函数,一个是win32程序入口函数,都是函数,但系统要求的形参不同!
嗯嗯, 非常感谢, {:7_113:}
页:
[1]