首页
社区
课程
招聘
[求助]为什么不出现窗口?
发表于: 2008-3-8 19:51 4543

[求助]为什么不出现窗口?

2008-3-8 19:51
4543
问题以解决,感谢版主小虾
俺打正确的程序与源码上传,供同志分享

我编的记事本程序.
运行后不出现窗口,但是LINK都成功了.
真郁闷.看了一下午.看不出问题.
希望高手帮助看一下.
谢谢.
我没有传RC代码

.386
.MODEL  FLAT,STDCALL
OPTION  CASEMAP:NONE

INCLUDE     c:\masm32\include\WINDOWS.INC
INCLUDE     c:\masm32\include\GDI32.INC
INCLUDE     c:\masm32\include\USER32.INC
INCLUDE     c:\masm32\include\KERNEL32.INC
include     c:\masm32\include\comctl32.inc
includelib  c:\masm32\lib\comctl32.lib
INCLUDELIB  c:\masm32\lib\GDI32.LIB
INCLUDELIB  c:\masm32\lib\USER32.LIB
INCLUDELIB  c:\masm32\lib\KERNEL32.LIB

WinMain PROTO:DWORD,:DWORD,:DWORD,:DWORD
WinProc PROTO:DWORD,:DWORD,:DWORD,:DWORD
FileOpen    PROTO:DWORD
FileSave    PROTO:DWORD

.DATA
    szDisplayName   db "Editor",0
    CommandLine     dd 0
    hWnd            dd 0
    hInstance       dd 0
    hWndEdit        dd 0
    szFileError     db "Read or Write File ERROR.",0
    szError         db "Error!",0
    szOpenFileName  db "T386.ASM",0
    szSaveFileName  db "T.ASM",0
    szEditClass     db "EDIT",0
    szClassName     db "MainWndClass",0
    AboutMsg        db "Open File Name:T386.ASM;Save File Name:T.ASM",0
    TheText         db "Save the Text?",0
    TheExit         db "Please Confirm Exit.",0
    MAXSIZE         = 2000
    Buf             db MAXSIZE+1 dup(0)
   
   

.CODE
START:
    INVOKE  GetModuleHandle,NULL
    MOV     hInstance,EAX
    INVOKE  InitCommonControls
    INVOKE  GetCommandLine
    MOV     CommandLine,EAX
    INVOKE  WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
    INVOKE  ExitProcess,EAX

WinMain PROC hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
        LOCAL   wc      :WNDCLASSEX
        LOCAL   msg     :MSG
        LOCAL   Wwd     :dword
        local   Wht     :dword
        local   Wtx     :dword
        local   Wty     :dword
        LOCAL   rectClient:RECT
        
        
    MOV     wc.cbSize,SIZEOF WNDCLASSEX
    MOV     wc.style,CS_VREDRAW+CS_HREDRAW+CS_DBLCLKS+CS_BYTEALIGNCLIENT+CS_BYTEALIGNWINDOW
    MOV     wc.lpfnWndProc,OFFSET WndProc
    MOV     wc.cbClsExtra,NULL
    MOV     wc.cbWndExtra,NULL
    PUSH    hInst
    POP     wc.hInstance
    MOV     wc.hbrBackground,COLOR_WINDOW+1
    MOV     wc.lpszMenuName,NULL
    MOV     wc.lpszClassName,OFFSET szClassName
    MOV     wc.hIcon,0
    INVOKE  LoadCursor,NULL,IDC_ARROW
    MOV     wc.hCursor,EAX
    MOV     wc.hIconSm,0
    INVOKE  RegisterClassEx,ADDR wc
    MOV     Wwd,600
    mov     Wht,400
    mov     Wtx,10
    mov     Wty,10
    INVOKE  CreateWindowEx,
                   WS_EX_ACCEPTFILES+WS_EX_APPWINDOW,
                   ADDR szClassName,
                   addr szDisplayName,
                   WS_OVERLAPPEDWINDOW+WS_VISIBLE,
                   Wtx,Wty,Wwd,Wht,
                   NULL,NULL,
                   hInst,NULL
    MOV     hWnd,EAX

    invoke  LoadMenu,hInst,600
    invoke  SetMenu,hWnd,eax
    invoke  GetClientRect,hWnd,addr rectClient
    INVOKE  CreateWindowEx,
                   WS_EX_ACCEPTFILES or WS_EX_CLIENTEDGE,
                   ADDR szEditClass,
                   NULL,
                   WS_CHILD+WS_VISIBLE+WS_HSCROLL+WS_VSCROLL+ES_MULTILINE+ES_AUTOVSCROLL+ES_AUTOHSCROLL,
                   rectClient.left,
                   rectClient.top,
                   rectClient.right,
                   rectClient.bottom,
                   hWnd,
                   0,hInst,0
    MOV     hWndEdit,EAX

StartLoop:
    INVOKE  GetMessage,ADDR msg,NULL,0,0
    CMP     EAX,0
    JE      ExitLoop
    INVOKE  TranslateMessage,ADDR msg
    INVOKE  DispatchMessage,ADDR msg
    JMP     StartLoop

ExitLoop:
    MOV     EAX,msg.wParam
    RET

WinMain     ENDP

WndProc   PROC  hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
   

    .IF uMsg==WM_COMMAND
        .IF wParam==1000
          invoke FileOpen,addr szOpenFileName
        .ELSEIF wParam==1100
          invoke MessageBox,hWin,addr TheText,addr szDisplayName,MB_YESNO
          .IF EAX==IDNO
            MOV EAX,0
            RET
          .ENDIF
          INVOKE FileSave,addr szSaveFileName
         .elseif wParam==1900
         invoke MessageBox,hWin,addr AboutMsg,addr szDisplayName,MB_OK
         .ENDIF

    .ELSEIF uMsg==WM_DESTROY
        INVOKE PostQuitMessage,NULL

    .ELSE
        INVOKE DefWindowProc,hWnd,uMsg,wParam,lParam
        RET
     .ENDIF
         MOV EAX,0
         RET
WndProc    ENDP

FileOpen proc lpszFileName:dword
    local nBytesToRead:dword
    local nBytesRead:dword
    local hFile:dword

    invoke CreateFile,
            lpszFileName,
            GENERIC_READ,
            FILE_SHARE_READ,
            NULL,
            OPEN_EXISTING,
            NULL,
            NULL
    CMP EAX,INVALID_HANDLE_VALUE
    JZ  error
    mov hFile,eax
    invoke GetFileSize,hFile,NULL
    CMP EAX,MAXSIZE
    JA  error_c
    mov nBytesToRead,eax
    invoke ReadFile,
             hFile,
             addr Buf,
             nBytesToRead,
             addr nBytesRead,
             NULL

    test eax,eax
    jz   error_c
    mov  eax,nBytesToRead
    mov  Buf[eax],0
    invoke CloseHandle,hFile
    invoke SendMessage,hWndEdit,WM_SETTEXT,0,ADDR Buf
    mov eax,1
    ret

error_c:
    invoke CloseHandle,hFile

error:
    invoke MessageBox,hWnd,addr szFileError,addr szError,MB_OK or MB_ICONWARNING
    XOR eax,eax
    RET

FileOpen endp

FileSave proc lpszFileName:dword
    local nBytesToWrite:dword
    local nBytesWritten:dword
    local hFile:dword

    invoke SendMessage,hWndEdit,WM_GETTEXTLENGTH,0,0
    CMP EAX,MAXSIZE
    JA  error
    mov nBytesToWrite,eax
    inc eax
    invoke SendMessage,hWndEdit,WM_GETTEXT,EAX,ADDR Buf

    invoke CreateFile,
            lpszFileName,
            GENERIC_WRITE,
            FILE_SHARE_WRITE,
            NULL,
            CREATE_ALWAYS,
            FILE_ATTRIBUTE_ARCHIVE,
            NULL
    CMP EAX,INVALID_HANDLE_VALUE
    JZ  error
    mov hFile,eax
    INVOKE WriteFile,
                hFile,
                addr Buf,
                nBytesToWrite,
                addr nBytesWritten,
                NULL

    test eax,eax
    jz   error_c
    invoke CloseHandle,hFile
    mov eax,1
    ret

error_c:
    invoke CloseHandle,hFile

error:
    invoke MessageBox,hWnd,addr szFileError,addr szError,MB_OK or MB_ICONWARNING
    XOR eax,eax
    RET

FileSave endp

        END START

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
请OD看看哪出错了
2008-3-8 20:18
0
雪    币: 321
活跃值: (275)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
3
缺少ShowWindow和UpdateWindow两句。
2008-3-8 20:21
0
雪    币: 23
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不会吧。
这个程序是我按书上写的。

出现主窗口就非要用这个函数?

我感觉是可能是里面有的句柄引用错了。
2008-3-8 20:45
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
WndProc   PROC  hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

INVOKE DefWindowProc,hWnd,uMsg,wParam,lParam
2008-3-8 20:58
0
雪    币: 23
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=小虾;425712]WndProc   PROC  hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

INVOKE DefWindowProc,hWnd,uMsg,wParam,lParam[/QUOTE]

多谢版主。非常感谢。

我把INVOKE DefWindowProc,hWnd,uMsg,wParam,lParam
改成INVOKE DefWindowProc,hWin,uMsg,wParam,lParam
就好了。版主非常之强人啊。

我刚才又看了一下书,是我自己不小心弄错了。这么小的细节,版主都看出来了。
强人。
向版主学习。

再次感谢。
希望能结交版主这样的朋友。
2008-3-8 21:22
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
呵,没事便好,写代码这样的小问题有时的确不好找。
2008-3-8 21:32
0
游客
登录 | 注册 方可回帖
返回