记事本终结者

//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真正的原汁原味。

 

原文地址:https://www.cnblogs.com/flaaash/p/3122299.html