同样的c++代码,同样使用的vc6,为什么我编译成的dll就150多k而人家的才几十k?有没有这方面的文章和资料?谢谢~~
解决方案 »
- VC++ 开发高负载服务器 UDP设计
- 关于SetCaretPos和TextOut的调用顺序问题
- 请问:、我的摄像头电源是15v的,我想通过串口或并口检测此摄像头的开或者关的状态,请行家们给点思路。2、该怎样把电源线和接口线连接起
- 请教VC中的字符串转换到整型的详细用法,请举例说明,
- 调试时出现normal block错误
- 请问如果要读取win2000的注册表中网卡的Domain,NameServer等信息要读取注册表中那个键?
- 请问cuteftp是一个sdi,mdi还是一个基于dialog的程序?
- 求助!!关于按钮与文件!给分!
- 我想找篇候老师写的文章,请哪位知道的大哥告知,谢谢!
- CRecordSet的delete()函数运行后游标处于什么状态?
- 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的程序另我满意了,如果你觉得还能减,不妨再做一些别的尝试,等你的好消息:)减肥总结:选择恰当的编译模式,去掉不必要的库。