• 记事本终结者


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

     

  • 相关阅读:
    删除IE缓存中指定的文件
    新破天一剑合区SQL(半成品)
    获取DOS命令的返回值.
    截取 a.exe 向 b.exe 传递 的启动参数
    五、Delphi 2009 泛型容器单元(Generics.Collections): TDictionary<T>
    C#结构体
    Delphi使用Zlib
    判断数据库是否存在
    去掉CodeGear的Welcome page.
    Indy10中IdMappedPortTCP的用法
  • 原文地址:https://www.cnblogs.com/flaaash/p/3122299.html
Copyright © 2020-2023  润新知