//
cl Win32Demo.cpp user32.lib
#include <Windows.h>
#include <dos.h>
int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,
int)
{
MessageBox(NULL,TEXT(
"
记事本终结者,从此再也不能运行记事本!
"),TEXT(
"
你很不幸!
"),
0X40);
while (
true)
{
HWND hNotepad = FindWindow(TEXT(
"
Notepad
"),NULL);
if (hNotepad != NULL)
{
PostMessage(hNotepad,WM_CLOSE,NULL,NULL);
}
}
}
用PEImport查看生成的EXE,发现
Name = USER32.dll
FirstThunk = 7104
Hint Function
-----------------------------------------
263 FindWindowA
580 MessageBoxA
620 PostMessageA
而 Kernel32居然有一大堆API引用,难以理解。通过vs编译链接如何去掉对MFC的引用,并优化最少的API调用?命令行呢?
在采用vs的release输出exe后只有8K,但是无法脱离MFC类库的引用,而cl直接编译居然有41k,没有了mfc但是kernel32的大堆引用出现了。
记得以前利用MASM32汇编写这个程序只有少量的API引用,看来cl编译器的优化还要学习啊。
.386
.model flat,stdcall
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
.data
szContent db "Notepad Killer, from now there's no NOTEPAD!",0
szCaption db 'Powerful MASM32',0
szClassName db 'Notepad',0
hwndNotepad dd ?
.code
start:
invoke ,0,offset szContent,offset szCaption,64
.while 1
invoke FindWindow,offset szClassName,0
mov hwndNotepad,eax
invoke SendMessage,hwndNotepad,16,0,0
invoke Sleep,100
.endw
end start
对应的MASM32汇编语言如上,编译链接方法:
ml /c /coff NotepadKiller.asm
link /subsystem:windows NotepadKiller.obj
生成的EXE文件3k,感觉应该可以更小,应该在LINK上下功夫。观察程序,并不像C++产生很多代码,也说明了MASM真正的原汁原味。