如何才能使vc生成的dll和exe尽量的小? 同样的c++代码,同样使用的vc6,为什么我编译成的dll就150多k而人家的才几十k?有没有这方面的文章和资料?谢谢~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DLL我不知道。看下下面这篇文章://题目:怎样使用 Visual C++ 编译出只有 1536 字节的窗口程序 //这些技巧都是dREAMtHEATER老大哥告我的…… //编译出来后,文件大小为: 1536 字节 //////////////////////////////////////////////////////////////////////////////////////////////////// //预处理 #include <Windows.h> #include "stdafx.h"//使用了下面的预处理,编译连接时必须是 Release 方式,否则不能通过 //自定义程序入口,如果要优化,推荐使用这个 //如果使用 VS.NET,也可以这样设置:在“解决方案管理器”里选定项目,右击,选择“属性”->“链接器”->“高级”->“入口点” //VC 6里面也有类似的设置,但具体不记得了 //项目属性的其它设置可以仔细看看,其它优化也都在这里可以设置 #pragma comment(linker, "/ENTRY:EntryPoint") //下面是调整段对齐,默认是 4K,在 Win98 下能更快地装入 PE 文件,但会增加 PE 文件的大小 //下面这一行在这里好像会说是“无效的指令”什么的,故在这里也注释掉了,也许是段太小的原因吧。 //直接在工程选项里面设置:项目“属性”->“链接器”->“优化”->“Windows98 优化”->“否 (/OPT:NOWIN98)” //#pragma comment(linker, "/OPT:NOWIN98") //下面的优化是段合并,不推荐使用,在很多程序里也许也许不能使用 #pragma comment(linker, "/SECTION:MiniPE,") //创建自定义的 MiniPE Section #pragma comment(linker, "/MERGE:.data=MiniPE") //合并.data Section 到 MiniPE Section #pragma comment(linker, "/MERGE:.text=MiniPE") //合并.text Section 到 MiniPE Section #pragma comment(linker, "/MERGE:.rdata=MiniPE") //合并.rdata Section 到 MiniPE Section //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //全局变量 HWND g_hWnd; //主窗口句柄,一般程序中经常用到此变量,故使用全局变量 HINSTANCE g_hInst; //应用程序进程句柄,一般程序中经常用到此变量,故使用全局变量 const char c_szAppName[] = "MiniPE"; //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //函数声明 LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow); //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //入口函数 //使用我们自己的入口函数,而不用连接器默认提供的一大堆程序初始化操作的代码 //为了在一个普通的 Win32SDK 程序里能使用这种方法,下面的函数将调用 WinMain() 函数,并给出相应的参数 void EntryPoint() { ExitProcess(WinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOWNORMAL)); } //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //主函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { MSG sMsg; WNDCLASSEX sWndClassEx; g_hInst = hInstance; sWndClassEx.cbSize = sizeof(WNDCLASSEX); sWndClassEx.style = CS_VREDRAW | CS_HREDRAW; sWndClassEx.lpfnWndProc = (WNDPROC) WindowProc; sWndClassEx.cbClsExtra = 0; sWndClassEx.cbWndExtra = 0; sWndClassEx.hInstance = g_hInst; sWndClassEx.hIcon = LoadIcon(NULL, IDI_APPLICATION); sWndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW); sWndClassEx.hbrBackground = (HBRUSH) (COLOR_WINDOW); sWndClassEx.lpszMenuName = NULL; sWndClassEx.lpszClassName = c_szAppName; sWndClassEx.hIconSm = NULL; RegisterClassEx(&sWndClassEx); g_hWnd = CreateWindowEx(0, c_szAppName, c_szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInst, NULL); ShowWindow(g_hWnd, iCmdShow); UpdateWindow(g_hWnd); while (GetMessage(&sMsg, NULL, 0, 0)) { TranslateMessage(&sMsg); DispatchMessage(&sMsg); } return((int) sMsg.wParam); } //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// //主窗口回调函数 LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, uMsg, wParam, lParam)); } return(0); } //////////////////////////////////////////////////////////////////////////////////////////////////// 最简单的办法是用UPX写十几K的小DLL很容易的,我的一个3M的EXE,压缩完毕后只剩700K。 我也找到一个EXE的,但是没有看到DLL的,我用fi看了,他没有加壳也是vc 6.0编译的相同的代码却差这么多?本文只讲述VC++编译的执行程序的减肥方法。 有关DLL、ATL等等再以后有时间在研究。 通常vc++编译出来的程序体积很大,debug模式的程序的最小体积一般都在100KB以上。这使不少人对VC++有了不好的印象,以为VC++是制造麻烦的工具。其实情况并不是这样,我们可以通过一些办法有效的减少执行程序的体积。下面通过一个具体的范例给你讲述:1,首先我们打开vc++建立一个Win32 Application,工程名随便,接下来选择“a Typical "hello World" application”(因为是范例,所以以hello world为标准)2,选择编译方式为Win32 - Release. 这时候你编译程序,生成的执行程序是28kb(如果你的机器感染了病毒,体积可能会大一些,如果我的机器感染了病毒,而你的机器正常,你的执行程序可能会小一些...这些全都是废话)3,选择菜单:Project->Settings(或者按Alt+F7),打开Link属性页。将Object/library modules:下面编辑框中的各种lib全部删除,然后打上MSVCRT.LIB kernel32.lib user32.lib 此后编译程序,生成的执行程序为20kb(此时编译程序会出现警告:LINK : warning LNK4098: default lib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library不必理会,如果你想去掉警告,就在Ignore all default libraries前打勾)4,接着上面,在Project->Settings的Link属性页里,在Project Options下面的编辑框里加上一句:/ALIGN:4096 这样做之后指定了程序不是驱动程序此后编译程序,生成的执行程序为7KB至此给Win32 Application减肥告一段落,7KB的程序另我满意了,如果你觉得还能减,不妨再做一些别的尝试,等你的好消息:)减肥总结:选择恰当的编译模式,去掉不必要的库。 http://expert.csdn.net/Expert/topic/1676/1676121.xml?temp=.2473871 限制同一程序同时存在的进程数 几个com问题请教高手 事件执行完后再执行类成员函数的问题 从网页上使用 OCX 调用 DLL 的函数 出现 Debug Error 急死了(数据库) 我派生的CPwdEdit类为什么提示为定义啊 kao,昨天虚惊一场,吓死偶了,放分庆祝一下 com组件LoadRegTypeLib错误 用ATL COM写的DLL MFC程序调用 求如何在DLL中添加一个关闭进程的方法 十万火急:寻找高手解决利用MODEM进行两台未联网的电脑间通讯的问题 nForce2的USB2.0问题?那位救救我啊? 如何在CListctrl的列表里放入其他的控件
//题目:怎样使用 Visual C++ 编译出只有 1536 字节的窗口程序
//这些技巧都是dREAMtHEATER老大哥告我的……
//编译出来后,文件大小为: 1536 字节
////////////////////////////////////////////////////////////////////////////////////////////////////
//预处理
#include <Windows.h>
#include "stdafx.h"
//使用了下面的预处理,编译连接时必须是 Release 方式,否则不能通过
//自定义程序入口,如果要优化,推荐使用这个
//如果使用 VS.NET,也可以这样设置:在“解决方案管理器”里选定项目,右击,选择“属性”->“链接器”->“高级”->“入口点”
//VC 6里面也有类似的设置,但具体不记得了
//项目属性的其它设置可以仔细看看,其它优化也都在这里可以设置
#pragma comment(linker, "/ENTRY:EntryPoint")
//下面是调整段对齐,默认是 4K,在 Win98 下能更快地装入 PE 文件,但会增加 PE 文件的大小
//下面这一行在这里好像会说是“无效的指令”什么的,故在这里也注释掉了,也许是段太小的原因吧。
//直接在工程选项里面设置:项目“属性”->“链接器”->“优化”->“Windows98 优化”->“否 (/OPT:NOWIN98)”
//#pragma comment(linker, "/OPT:NOWIN98")
//下面的优化是段合并,不推荐使用,在很多程序里也许也许不能使用
#pragma comment(linker, "/SECTION:MiniPE,") //创建自定义的 MiniPE Section
#pragma comment(linker, "/MERGE:.data=MiniPE") //合并.data Section 到 MiniPE Section
#pragma comment(linker, "/MERGE:.text=MiniPE") //合并.text Section 到 MiniPE Section
#pragma comment(linker, "/MERGE:.rdata=MiniPE") //合并.rdata Section 到 MiniPE Section
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
//全局变量
HWND g_hWnd; //主窗口句柄,一般程序中经常用到此变量,故使用全局变量
HINSTANCE g_hInst; //应用程序进程句柄,一般程序中经常用到此变量,故使用全局变量 const char c_szAppName[] = "MiniPE";
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
//函数声明
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow);
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//入口函数
//使用我们自己的入口函数,而不用连接器默认提供的一大堆程序初始化操作的代码
//为了在一个普通的 Win32SDK 程序里能使用这种方法,下面的函数将调用 WinMain() 函数,并给出相应的参数
void EntryPoint()
{
ExitProcess(WinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOWNORMAL));
}
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
//主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
MSG sMsg;
WNDCLASSEX sWndClassEx;
g_hInst = hInstance; sWndClassEx.cbSize = sizeof(WNDCLASSEX);
sWndClassEx.style = CS_VREDRAW | CS_HREDRAW;
sWndClassEx.lpfnWndProc = (WNDPROC) WindowProc;
sWndClassEx.cbClsExtra = 0;
sWndClassEx.cbWndExtra = 0;
sWndClassEx.hInstance = g_hInst;
sWndClassEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
sWndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW);
sWndClassEx.hbrBackground = (HBRUSH) (COLOR_WINDOW);
sWndClassEx.lpszMenuName = NULL;
sWndClassEx.lpszClassName = c_szAppName;
sWndClassEx.hIconSm = NULL;
RegisterClassEx(&sWndClassEx); g_hWnd = CreateWindowEx(0, c_szAppName, c_szAppName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, g_hInst, NULL);
ShowWindow(g_hWnd, iCmdShow);
UpdateWindow(g_hWnd); while (GetMessage(&sMsg, NULL, 0, 0))
{
TranslateMessage(&sMsg);
DispatchMessage(&sMsg);
}
return((int) sMsg.wParam);
}
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
//主窗口回调函数
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
break; default:
return(DefWindowProc(hWnd, uMsg, wParam, lParam));
}
return(0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
有关DLL、ATL等等再以后有时间在研究。 通常vc++编译出来的程序体积很大,debug模式的程序的最小体积一般都在100KB以上。这使不少人对VC++有了不好的印象,以为VC++是制造麻烦的工具。其实情况并不是这样,我们可以通过一些办法有效的减少执行程序的体积。下面通过一个具体的范例给你讲述:1,首先我们打开vc++建立一个Win32 Application,工程名随便,接下来选择“a Typical "hello World" application”(因为是范例,所以以hello world为标准)2,选择编译方式为Win32 - Release. 这时候你编译程序,生成的执行程序是28kb(如果你的机器感染了病毒,体积可能会大一些,如果我的机器感染了病毒,而你的机器正常,你的执行程序可能会小一些...这些全都是废话)3,选择菜单:Project->Settings(或者按Alt+F7),打开Link属性页。将Object/library modules:下面编辑框中的各种lib全部删除,然后打上MSVCRT.LIB kernel32.lib user32.lib 此后编译程序,生成的执行程序为20kb(此时编译程序会出现警告:LINK : warning LNK4098: default lib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library不必理会,如果你想去掉警告,就在Ignore all default libraries前打勾)4,接着上面,在Project->Settings的Link属性页里,在Project Options下面的编辑框里加上一句:/ALIGN:4096 这样做之后指定了程序不是驱动程序此后编译程序,生成的执行程序为7KB至此给Win32 Application减肥告一段落,7KB的程序另我满意了,如果你觉得还能减,不妨再做一些别的尝试,等你的好消息:)减肥总结:选择恰当的编译模式,去掉不必要的库。