鱼C论坛

 找回密码
 立即注册
查看: 1931|回复: 4

WIN32汇编的接受程序收到的小心总是0

[复制链接]
发表于 2012-8-27 19:44:37 | 显示全部楼层 |阅读模式
30鱼币
求解啊?接收到的消息总是0.
以下是send程序
.386
.model flat,stdcall
option casemap:none


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
hWnd dd ?
szBuffer db 256 dup(?)
stCopydata COPYDATASTRUCT <>
.const
szClassName db 'MyClass',0
szStart db 'Press OK to send message %08x!',0
szText  db 'THIS IS THE MEESSAGE I SEND JUST NOW!',0
szCaption db 'sending ...',0
szReturn db 'I have return from the hell!',0
szError   db 'opps!',0
.code
start:
invoke FindWindow,offset szClassName,NULL
.if eax
mov hWnd ,eax                                                        ;取得目标窗口的句柄
        invoke wsprintf,offset szBuffer,offset szStart,offset szText
       
        invoke MessageBox,NULL,offset szBuffer,offset szCaption,MB_OK
       
        invoke SendMessage,hWnd,WM_COPYDATA,0,offset stCopydata       

        mov stCopydata.cbData,sizeof szText

        mov stCopydata.lpData,offset szText

        mov stCopydata.dwData,offset szText
invoke MessageBox,NULL,offset szReturn,offset szCaption,MB_OK
.else
invoke MessageBox,NULL,offset szError,offset szCaption,MB_OK
.endif
invoke ExitProcess,NULL

end start


最佳答案

查看完整内容

其他程序我没看,我只看发送程序 invoke SendMessage,hWnd,WM_COPYDATA,0,offset stCopydata mov stCopydata.cbData,sizeof szText mov stCopydata.lpData,offset szText mov stCopydata.dwData,offset szText 你顺序搞错了吧。_ _ 应该先赋值后发送 不行再叫我 mov stCopydata.cbData,sizeof szText mov stCopydata.lpData,offset szText mov ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-27 19:44:38 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2012-8-27 20:03 编辑

其他程序我没看,我只看发送程序
invoke SendMessage,hWnd,WM_COPYDATA,0,offset stCopydata        

        mov stCopydata.cbData,sizeof szText

        mov stCopydata.lpData,offset szText

        mov stCopydata.dwData,offset szText


你顺序搞错了吧。_ _
应该先赋值后发送

不行再叫我

        mov stCopydata.cbData,sizeof szText

        mov stCopydata.lpData,offset szText

        mov stCopydata.dwData,offset szText

invoke SendMessage,hWnd,WM_COPYDATA,0,offset stCopydata        
另外遇到问题最好直抓重点
发送的值为0?谁发送的?发送的那个步骤没错?没错,OK,向上找,看发送的数据来源


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

使用道具 举报

 楼主| 发表于 2012-8-27 19:45:37 | 显示全部楼层
以下是接收程序:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 3rd Edition>
; by 罗云彬, http://www.win32asm.com.cn
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; SendMessage.asm
; 从一个程序向另一个窗口程序发送消息 之 发送程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff SendMessage.asm
; Link /subsystem:windows SendMessage.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .386
                .model flat,stdcall
                option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data
hWnd                dd        ?
szBuffer        db        512 dup (?)
stCopyData        COPYDATASTRUCT <>

szCaption        db        'SendMessage',0
szStart                db        'Press OK to start SendMessage, text address: %08x!',0
szReturn        db        'SendMessage returned!',0
szDestClass        db        'MyClass',0        ;目标窗口的窗口类
szText                db        'Text send to other windows',0
szNotFound        db        'Receive Message Window not found!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code
start:
                invoke        FindWindow,addr szDestClass,NULL
                .if        eax
                        mov        hWnd,eax        ;找到目标窗口则发送消息
                        invoke        wsprintf,addr szBuffer,addr szStart,addr szText
                        invoke        MessageBox,NULL,offset szBuffer,offset szCaption,MB_OK
                        mov        stCopyData.cbData,sizeof szText
                        mov        stCopyData.lpData,offset szText
                        invoke        SendMessage,hWnd,WM_COPYDATA,0,addr stCopyData
                        invoke        MessageBox,NULL,offset szReturn,offset szCaption,MB_OK
                .else
                        invoke        MessageBox,NULL,offset szNotFound,offset szCaption,MB_OK
                .endif
                invoke        ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                end        start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-27 19:47:09 | 显示全部楼层
错了。。。。1L是发送程序,3L是接收程序
以下:

.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                 user32.inc
include          kernel32.inc
include          windows.inc
includelib          user32.lib
includelib          kernel32.lib
includelib   gdi32.lib
include          gdi32.inc

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain  dd ?
szBuffer db 100 dup(?)
.const
szClassName db 'MyClass',0
szCaption  db 'My first window',0
szText     db 'shit this is bull shit!',0
szReceiveMessage db 'This is the message I received:',0dh,0ah
                                        db 'Param :%x08',0dh,0ah
                                        db 'text:%s',0dh,0ah,0
szReceiveMessage2 db 'This is the message:',0dh,0ah
                                        db 'lengthof data: %d',0dh,0ah
                                        db 'text :"%s"',0dh,0ah
                                        db 'value address:%08x',0dh,0ah,0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>窗口过程
.code

_ProcWinmain proc uses ebx esi edi hWnd,uMsg,wParam,lParam;需要几个信息参数:uMsg:消息类型,PARAM消息的两个参数
local @stPs:PAINTSTRUCT                                                                            ;stPs 用于存放创建和关闭窗口的窗口绘制信息
local @stRect:RECT                                                                                        ;stRect用于存放窗口客户区的坐标
local @hDc                                                                                                        ;hDc用于存放要输出的窗口设备


mov eax,uMsg
.if eax == WM_PAINT
        invoke BeginPaint,hWnd,addr @stPs
        mov @hDc,eax
       
        invoke GetClientRect,hWnd,addr @stRect                                        ;用于取得窗口客户区的坐标,将其值放入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
.elseif eax == WM_SETTEXT
        invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK
        invoke wsprintf,offset szBuffer,addr szReceiveMessage,lParam,lParam
        invoke MessageBox,NULL,offset szBuffer,offset szCaption,MB_OK
.elseif eax == WM_COPYDATA
        mov        eax,lParam
        assume eax:ptr COPYDATASTRUCT
        invoke wsprintf,offset szBuffer,offset szReceiveMessage2,\
        [eax].cbData,[eax].lpData,[eax].lpData
        invoke MessageBox,hWnd,offset szBuffer,offset szCaption,MB_OK
        assume eax:nothing
.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
mov @stWndClass.cbSize,sizeof @stWndClass
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinmain
push hInstance

pop        @stWndClass.hInstance
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
invoke LoadIcon,0,IDI_ASTERISK
mov @stWndClass.hIcon,eax
mov @stWndClass.hbrBackground,COLOR_WINDOW+1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass




;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>创建窗口
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,offset szClassName,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                                                                                ;取得消息为WM_QUIT的时候返回0值
        invoke TranslateMessage,addr @stMsg
        invoke DispatchMessage,addr @stMsg
.endw
ret



_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>开始
start :
        call _WinMain
        invoke ExitProcess,NULL
end start










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

使用道具 举报

 楼主| 发表于 2012-8-27 20:42:58 | 显示全部楼层

真屎。。。。。。居然错在这里了。。。码字码的都有点晕了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-27 23:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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