鱼C论坛

 找回密码
 立即注册
查看: 3263|回复: 11

win32第一个程序,在线求问

[复制链接]
发表于 2015-4-17 18:24:51 | 显示全部楼层 |阅读模式
100鱼币
为什么两个都是自己定义的子程序,_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
QQ截图20150417181931.png

最佳答案

查看完整内容

这是基于win32汇编的一个窗口代码,求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-17 18:24:52 | 显示全部楼层
    .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
AppLoadMsgText  db  "收到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                        ; 主程序入口点

    invoke  GetModuleHandle, 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汇编的一个窗口代码,求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-17 22:36:06 | 显示全部楼层
楼主代码乱了哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-17 22:44:09 | 显示全部楼层
楼主这个帖子的内容属于汇编windows程序设计,不知道我可以解决的了吗。明天给你看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-17 22:47:09 | 显示全部楼层
是不是和函数放的位置有关,把被调用的函数过程写在调用这个函数之前试一试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-4-17 23:18: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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-4-17 23:27:19 | 显示全部楼层
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  
  
都是子程序,为什么一个遵从书上子程序的定义,另个貌似不用遵循;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-18 03:48:25 | 显示全部楼层
逆流杀 发表于 2015-4-17 23:27
这是从网上找的注释;

最简单实用的方法就是拿C写一个窗口,然后调试的时候看一下反汇编代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-4-19 22:57:24 | 显示全部楼层
freeparty 发表于 2015-4-19 17:12
这是基于win32汇编的一个窗口代码,求最佳答案

看的出来,版主很用心,辛苦了,但我还是想说,我不是想要源代码,我只是纠结,为什么,_ProcWinMain   后面有这些东西proc   uses ebx edi esi,hWnd,uMsg,wParam,lparam   这些参数;而——WinMain proc    后面没有这些玩意,不管怎么说,还是谢谢版主的解答,辛苦了,我自己再慢慢往后面看看,可能以后就会懂了,谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-20 00:55:48 From FishC Mobile | 显示全部楼层
本帖最后由 santaclaus 于 2015-4-20 01:02 编辑

因为一个消息的回调函数,一个是win32程序入口函数,都是函数,但系统要求的形参不同!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-4-20 12:31:49 | 显示全部楼层
santaclaus 发表于 2015-4-20 00:55
因为一个消息的回调函数,一个是win32程序入口函数,都是函数,但系统要求的形参不同!

嗯嗯, 非常感谢,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-22 09:45:30 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 13:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表