C++/Win32 最小的可能的消息框("Hello")应用程序exe?



我正在做一个非常大的项目,每次新版本出来时,我都需要将exe上传到某人,并且我的连接是通过电话调制解调器进行的。

我想为一个旨在运行代码的应用程序编译尽可能小的 exe:MessageBox(0, "Hello", 0, MB_OK);

我正在使用Visual Studio 2010。到目前为止我的尝试:

版本 0、尺寸和开关:

7kB (发布)
已使用: \O1

版本 1、尺寸和开关:

3kB (发布)
已使用:\O1,关闭缓冲区安全检查,忽略默认库链接。

这可以做得比3kB更小吗?哪些编译器标志会影响可执行文件的大小?

动态链接 CRT(即在代码生成选项中为 CRT 选择"多线程 DLL";应该是默认值)。选择大小优化。告诉链接器降低对齐要求(/ALIGN 和/OPT:NOWIN98,可以在项目配置对话框中链接器选项下的命令行选项框中输入)(注意:这可能会导致应用程序在某些 Windows 版本下无法运行)。

除此之外,您还可以使用打包程序,例如 UPX,但请记住,如果某些防病毒工具无法成功分析其内容,则会错误地将打包的可执行文件检测为恶意软件。Windows可执行文件的其他可用打包程序包括Crinkler和kkrunchy

即使没有打包程序,您也可以做一些技巧,例如合并 PE 部分并将代码放在 PE 标头中。通过这样做,您可以获得大约 700 字节左右(未压缩)的简单"Hello world"MessageBox 可执行文件。我不认为可视化C++链接器支持这些操作。请参阅 Tiny PE 页面,了解如何手动完成此操作的示例(他将其发挥到了极致)。

创建一个

新的 C++ Win32 项目,然后选择空项目选项。

添加包含以下内容的文件 main.cpp:

#include <Windows.h>
void HelloWorldMain()
{
    MessageBox(0, L"Hello", 0, MB_OK);
}

在项目属性中,关闭缓冲区安全检查(C++>代码生成),忽略所有默认库(链接器>输入),并将入口点(链接器>高级)设置为 HelloWorldMain。

构建发布配置;输出 exe 将为 3K。

#undef UNICODE
#define UNICODE
#include <windows.h>
void startup()
{
    MessageBox( 0, L"Hello", L"Hi", MB_SETFOREGROUND );
    ExitProcess( 0 );
}

[d:\开发\测试]> cl foo.cpp kernel32.lib user32.lib/O2/link/entry:startup/subsystem:windows呜.cpp[d:\开发\测试]> dir foo.exe 驱动器 D 中的卷是数据 卷序列号为 A875-F9FD d:\dev\test 目录09.08.2012 18:00 2 560 foo.exe               1 文件 2 560 字节               0 目录 144 102 051 840 字节可用[d:\开发\测试]> _

像这样:

#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
     MessageBox (NULL, "Hello, Windows 98!", "HelloMsg", MB_OK) ;
     return 0 ;
}

相关内容

最新更新