关于WIN32问题。

菜鸟一只_热爱ASM 2012-09-04 03:08:50
这段代码编译链接完成以后,运行EXE没有反应啊。老罗光盘里的也是一样。请问什么原因呢?谢谢了。


.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 1000
DLG_MAIN EQU 1000
IDC_TEXT EQU 1001
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
hHook dd ?
szAscii db 32 dup(?)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;钩子回调函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
HookProc proc _dwCode,_wParam,_lParam
LOCAL @szKeyState[256]:byte

invoke CallNextHookEx,hHook,_dwCode,_wParam,_lParam
pushad
.if _dwCode == HC_ACTION
mov ebx,_lParam
assume ebx:ptr EVENTMSG
.if [ebx].message == WM_KEYDOWN
invoke GetKeyboardState,addr @szKeyState
invoke GetKeyState,VK_SHIFT
MOV @szKeyState+VK_SHIFT,al
mov ecx,[ebx].paramH
shr ecx,16
invoke ToAscii,[ebx].paramL,ecx,addr @szKeyState,addr szAscii,0
mov byte ptr szAscii [eax],0
.if szAscii ==0dh
mov word ptr szAscii+1,0ah
.endif
invoke SendDlgItemMessage,hWinMain,IDC_TEXT,EM_REPLACESEL,0,addr szAscii
.endif
assume ebx:nothing
.endif
popad
ret
HookProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam

mov eax,wMsg
;************************************************************************************************
.if eax == WM_CLOSE
invoke UnhookWindowsHookEx,hHook
invoke EndDialog,hWnd,NULL
;************************************************************************************************
.elseif eax == WM_INITDIALOG
push hWnd
pop hWinMain
invoke SetWindowsHookEx,WH_JOURNALRECORD,addr HookProc,hInstance,NULL
.if eax
mov hHook,eax
.else
invoke EndDialog,hWnd,NULL

.endif
;************************************************************************************************
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret

_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start


...全文
167 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]不可能啊。我用WIN32光盘里面的也运行不了。[/Quote]我对 makefile 不熟悉,所以看不出来其是否有问题。可以仔细看下这个 makefile 运行时是否确实一切顺利,没有出现警告或错误。其次,可以用 ExeScope 这类资源查看软件看看最后生成的 exe 文件里确实存在个 id 为 1000 的对话框定义;或者将这个 exe 文件上传到你的资源里贴出 url 来让大家看看。
yh_no_code 2012-09-06
  • 打赏
  • 举报
回复
工程发过来看看,649248061@qq.com
Silent_hi 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

那就是没有将 res 一起链进去:link /subsystem:windows testhook.obj testhkres.res
[/Quote]
不可能啊。我用WIN32光盘里面的也运行不了。

NAME = RecHook

ML_FLAG = /c /coff
LINK_FLAG = /subsystem:windows

$(NAME).exe: $(NAME).obj $(NAME).res
Link $(LINK_FLAG) $(NAME).obj $(NAME).res

.asm.obj:
ml $(ML_FLAG) $<
.rc.res:
rc $<

clean:
del *.obj
del *.res

yh_no_code 2012-09-06
  • 打赏
  • 举报
回复
这贴回复了很多次,为什么回复不了?why???
Silent_hi 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

那就是没有将 res 一起链进去:link /subsystem:windows testhook.obj testhkres.res
[/Quote]
不可能啊。我有链接的。

NAME = RecHook

ML_FLAG = /c /coff
LINK_FLAG = /subsystem:windows

$(NAME).exe: $(NAME).obj $(NAME).res
Link $(LINK_FLAG) $(NAME).obj $(NAME).res

.asm.obj:
ml $(ML_FLAG) $<
.rc.res:
rc $<

clean:
del *.obj
del *.res

yh_no_code 2012-09-06
  • 打赏
  • 举报
回复
工程发过来看看 649248061@qq.com
zara 2012-09-05
  • 打赏
  • 举报
回复
那就是没有将 res 一起链进去:link /subsystem:windows testhook.obj testhkres.res
Silent_hi 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

将 obj 和 res 一起链接创建成 exe 文件后运行之,出现了个对话框窗口,按键其中有显示的。
[/Quote]
...我也生成 EXE了,就是打开没有任何反应啊。
zara 2012-09-04
  • 打赏
  • 举报
回复
将 obj 和 res 一起链接创建成 exe 文件后运行之,出现了个对话框窗口,按键其中有显示的。
Silent_hi 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

应该还有个 rc/res 资源类的文件吧,里面定义了所使用到的对话框等,link 时要把它和 obj 文件一起创建 exe 文件。没有了这个,就没有了这个程序所使用的窗口,也就没什么表现了。
[/Quote]
谢谢啦,不过RC文件有的啊。也编译链接了

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN 1000
#define DLG_MAIN 1000
#define IDC_TEXT 1001
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN DIALOG 208, 130, 234, 167
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "键盘钩子"
FONT 9, "宋体"
{
EDITTEXT IDC_TEXT, 5, 5, 224, 158, ES_MULTILINE | ES_AUTOVSCROLL
| WS_BORDER | WS_VSCROLL | WS_TABSTOP | ES_READONLY
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

zara 2012-09-04
  • 打赏
  • 举报
回复
应该还有个 rc/res 资源类的文件吧,里面定义了所使用到的对话框等,link 时要把它和 obj 文件一起创建 exe 文件。没有了这个,就没有了这个程序所使用的窗口,也就没什么表现了。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧