关于addr和offset的问题
FindWindow,addr szDestClass,NULL
wsprintf,addr szBuffer,addr szStart,addr szText
SendMessage,hWnd,WM_SETTEXT,0,addr szText
中为何用的都是addr 它们之后的变量都是全局变量啊
为何不用offset?
以下是源代码
.386
.model flat,stdcall
option casemap:none
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
; Include 文件定义
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
includewindows.inc
includeuser32.inc
includelibuser32.lib
includekernel32.inc
includelibkernel32.lib
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
; 数据段
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
.data
hWnddd?
szBufferdb256 dup (?)
.const
szCaptiondb 'SendMessage ',0
szStartdb 'Press OK to start SendMessage, param: %08x! ',0
szReturndb 'SendMessage returned! ',0
szDestClassdb 'MyClass ',0;目标窗口的窗口类
szTextdb 'Text send to other windows ',0
szNotFounddb 'Receive Message Window not found! ',0
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
; 代码段
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
.code
start:
invokeFindWindow,addr szDestClass,NULL
.ifeax
movhWnd,eax;找到目标窗口则发送消息
invokewsprintf,addr szBuffer,addr szStart,addr szText
invokeMessageBox,NULL,offset szBuffer,offset szCaption,MB_OK
invokeSendMessage,hWnd,WM_SETTEXT,0,addr szText
invokeMessageBox,NULL,offset szReturn,offset szCaption,MB_OK
.else
invokeMessageBox,NULL,offset szNotFound,offset szCaption,MB_OK
.endif
invokeExitProcess,NULL
;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
endstart
[解决办法]
因为addr表示传递的是变量的指针(因此,我认为用offset代替也是可以的),可以被修改后作为输出参数使用,因为这些过程是在主过程之中被调用的,所以他们必须是全局变量,因为主过程内似乎不能使用局部变量,另外,如果子过程调用这些过程,理论上局部变量也是可以的,除非编译器不支持“addr 局部变量”这种格式,这种情况是可能发生的,因为毕竟局部变量是在堆栈上创建的,具有动态性,而且是用SS:SP来寻址,和全局变量有很大的差异。