鱼C论坛

 找回密码
 立即注册
查看: 1910|回复: 15

Win32汇编,窗口菜单文字乱码,不知道原因,求解释

[复制链接]
发表于 2013-11-18 18:00:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
.386
                .model flat,stdcall
                option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ        等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN        equ                1000h        ;图标
IDM_MAIN        equ                2000h        ;菜单
IDA_MAIN        equ                3000h        ;加速键
IDM_NEW                equ                2001h
IDM_OPEN        equ                2002h
IDM_SAVE        equ                2003h
IDM_SAVEAS        equ                2004h
IDM_PRINT        equ                2005h
IDM_EXIT        equ                2006h
IDM_HELP        equ                2007h
IDM_ABOUT        equ                2008h

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data?
hInstance        dd                ?
hWinMain        dd                ?
hMenu                dd                ?
hSubMenu        dd                ?
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .const
szClassName                db        'Menu Example',0
szCaptionMain        db        'Assmbly',0
szMenuHelp                db        '帮助主题(&H)...',0
szMenuAbout                db        '关于本程序(&A)...',0
szCaption                db        '窗口',0
szFormat                db        '你选择的菜单命令:%08x',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code
_DisplayMenuItem        proc        _dwCommandID
                local        @szBuffer[256]:byte
                pushad
                invoke        wsprintf,addr @szBuffer,addr szFormat,_dwCommandID
                invoke        MessageBox,hWinMain,addr @szBuffer,offset        szCaption,MB_OK
                popad
                ret
_DisplayMenuItem        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Quit        proc
                invoke        DestroyWindow,hWinMain
                invoke        PostQuitMessage,NULL
                ret
_Quit        endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain        proc        uses ebx edi esi hWnd,uMsg,wParam,lParam
                local        @stPos:POINT
                local        @hSysMenu
               

                mov        eax,uMsg
;********************************************************************
                .if        eax ==        WM_CREATE
                        invoke        GetSubMenu,hMenu,1
                        mov hSubMenu,eax
                        ;在系统菜单中添加菜单项
                        invoke        GetSystemMenu,hWnd,FALSE
                        mov        @hSysMenu,eax
                        invoke        AppendMenu,@hSysMenu,MF_SEPARATOR,0,NULL
                        invoke        AppendMenu,@hSysMenu,0,IDM_HELP,offset szMenuHelp
                        invoke        AppendMenu,@hSysMenu,0,IDM_ABOUT,offset        szMenuAbout
                        ;处理菜单和加速键消息
                .elseif        eax        ==        WM_COMMAND
                        invoke        _DisplayMenuItem,wParam
                        mov eax,wParam
                        movzx        eax,ax
                .elseif        eax        ==        IDM_EXIT
                                call        _Quit
                        
                        
;********************************************************************
                .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
                local        @hAccelerator

                invoke        GetModuleHandle,NULL
                mov        hInstance,eax
                invoke        LoadMenu,hInstance,IDM_MAIN
                mov hMenu,eax
                invoke        LoadAccelerators,hInstance,IDA_MAIN
                mov        @hAccelerator,eax
;********************************************************************
; 注册窗口类
;********************************************************************
                invoke        RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
                invoke        LoadIcon,hInstance,ICO_MAIN
                mov        @stWndClass.hIcon,eax
                mov @stWndClass.hIconSm,eax
                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,hMenu,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        TranslateAccelerator,hWinMain,@hAccelerator,addr        @stMsg
                        
                        .if        eax        ==        0
                                invoke        TranslateMessage,addr @stMsg
                                invoke        DispatchMessage,addr @stMsg
                        .endif
                .endw
                ret

_WinMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
                call        _WinMain
                invoke        ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                end        start
;这是代码,下面是资源文件

#include        <resource.h>
//定义资源
#define        ICO_MAIN        0x1000        //图标
#define        IDM_MAIN        0x2000        //菜单
#define        IDA_MAIN        0x3000        //加速键

//定义子子菜单项
#define        IDM_NEW                0x2001
#define        IDM_OPEN        0x2002
#define        IDM_SAVE        0x2003
#define        IDM_SAVEAS        0x2004
#define        IDM_PRINT        0x2005
#define        IDM_EXIT        0x2006
#define        IDM_HELP        0x2007
#define        IDM_ABOUT        0x2008

ICO_MAIN        ICON        "main.ico"

IDM_MAIN        menu        discardable
BEGIN        
        popup        "文件(&F)"
        BEGIN
                menuitem        "新建(&N)\tCtrl+N",                IDM_NEW
                menuitem        "打开(&O)...\tCtrl+O"        IDM_OPEN        
                menuitem        "保存(&S)...\tCtrl+S"        IDM_SAVE
                menuitem        "另存为(&A)..."                        IDM_SAVEAS
                menuitem        separator
                menuitem        "打印(&P)...\tCtrl+P"        IDM_PRINT
                menuitem        separator
                menuitem        "退出(&X)"                                IDM_EXIT
        END
        popup        "帮助(&H)",        HELP
        BEGIN        
                menuitem        "帮助主题(&H)\tF1"        IDM_HELP
                menuitem        separator
                menuitem        "关于(&A)...",        IDM_ABOUT
        END
END
        
IDA_MAIN        accelerators
BEGIN        
        "^N",                IDM_NEW               
        "^O",                IDM_OPEN
        "^S",                IDM_SAVE
        "^P",                IDM_PRINT        
        VK_F1,                IDM_HELP,        VIRTKEY
END        




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-18 18:07:27 | 显示全部楼层
你看看你文件保存时候的编码,也有可能是这里出问题了………………
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-18 18:10:56 | 显示全部楼层

正常记事本保存啊,朋友,以前也弄过相同的,没有出现过问题的。这个就出问题了,着实不知道原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-18 18:20:31 | 显示全部楼层
Micheal 发表于 2013-11-18 18:10
正常记事本保存啊,朋友,以前也弄过相同的,没有出现过问题的。这个就出问题了,着实不知道原因

不知道。我遇到过的问题,就是记事本的默认保存编码被改掉了。结果程序读进去的就是乱码了………………
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-18 18:22:12 | 显示全部楼层
1144290241 发表于 2013-11-18 18:20
不知道。我遇到过的问题,就是记事本的默认保存编码被改掉了。结果程序读进去的就是乱码了………………

朋友,那你试着复制下,然后按照你得方式编译,运行,看看结果。给我说下,好不好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-18 18:23:28 | 显示全部楼层
1144290241 发表于 2013-11-18 18:20
不知道。我遇到过的问题,就是记事本的默认保存编码被改掉了。结果程序读进去的就是乱码了………………

朋友你试着把这段代码复制,编译下,看看结果。给我说下,好吗:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-18 18:34:03 | 显示全部楼层
Micheal 发表于 2013-11-18 18:23
朋友你试着把这段代码复制,编译下,看看结果。给我说下,好吗

实际上我也想来着。我好久没看asm的了,现在在考研……………上鱼c只是习惯………………
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-18 18:40:53 | 显示全部楼层
1144290241 发表于 2013-11-18 18:34
实际上我也想来着。我好久没看asm的了,现在在考研……………上鱼c只是习惯………………

:handshake哦,哦   还是谢谢你哈。有学了点儿。保存的时候编码的选择
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-18 18:44:19 | 显示全部楼层
Micheal 发表于 2013-11-18 18:40
哦,哦   还是谢谢你哈。有学了点儿。保存的时候编码的选择

没事,共同学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-18 18:47:01 | 显示全部楼层
支持楼主,赞一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-20 15:45:41 | 显示全部楼层
夜★霜寒 发表于 2013-11-18 18:47
支持楼主,赞一个

多来点儿人回复啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-22 04:36:02 | 显示全部楼层
重新复制下,然后新建,粘贴~我也碰到过这个问题:sad
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-22 21:58:45 | 显示全部楼层
City_of_the_sky 发表于 2013-11-22 04:36
重新复制下,然后新建,粘贴~我也碰到过这个问题

{:2_34:}这也行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-22 22:21:08 | 显示全部楼层
{:2_35:}多谢各位亲,,本人已找到是什么地方出问题了、。谢谢  帮顶了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-25 08:01:16 | 显示全部楼层

不贴答案?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-26 12:48:41 | 显示全部楼层
看不当明白!~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 17:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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