找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 8827|回复: 3

[例程] 减小VC编译文件体积示例源码(VC++系列X86、X64小体积程序模板)

  [复制链接]

7

主题

36

回帖

2

精华

初来乍到

积分
3171
发表于 2011-6-7 09:08:26 | 显示全部楼层 |阅读模式
本帖最后由 lxl1638 于 2011-6-9 16:50 编辑

附件内的 VC2005_TEST.VCPROJ 是 VC2005 的工程文件,已设置好了X86、X64编译选项,
当然也可以用VC2008、VC2010打开;
附件内的 VC2010_TEST.VCXPROJ 是 VC2010 的工程文件,也设置好了X86、X64编译选项;

MSVCRT-X86.LIB、MSVCRT-X64.LIB就是VC++安装目录中的MSVCRT.LIB,本人改了文件名,
前者是Win32版本(来自VC6),后者是Win64版本(记不起VC2005的还是VC2010的,都可用)。
链接这两个MSVCRT.LIB,EXE文件不需要msvcrXXXX.dll,体积也减小了,本例程源码编译
出的X86、X64版的EXE都只有2、3K


BIN.rar (1.98 KB, 下载次数: 6732) EXE

核心源码:

  1. //////////////////////////////////////////////////////////////////////////////////////////
  2. #pragma comment(linker, "/ENTRY:EntryPoint")
  3. #pragma comment(linker, "/MERGE:.rdata=.text")

  4. #if defined(_M_X64)
  5. #pragma comment(lib, "MSVCRT-X64.LIB")
  6. //#define NTDWORD        DWORD_PTR
  7. //#define PDWORD_PTR        PNTDWORD
  8. #else
  9. #pragma comment(lib, "MSVCRT-X86.LIB")
  10. //#define NTDWORD        DWORD
  11. //#define PDWORD                PNTDWORD
  12. #endif

  13. #pragma comment(lib, "Comctl32.lib")
  14. #include <Windows.h>
  15. #include <CommCtrl.h>
  16. #define WINDOW_STYLE                (WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX)
  17. #define CHILD_STYLE                        (WS_VISIBLE|WS_CHILD)
  18. #define STATIC_STYLE                (CHILD_STYLE|BS_TEXT)
  19. #define BUTTON_STYLE                (STATIC_STYLE|BS_PUSHLIKE)
  20. #define STR_MessageBoxW                TEXT("MessageBoxW")
  21. #define STR_TEST                        TEXT("TEST")
  22. //////////////////////////////////////////////////////////////////////////////////////////////////

  23. HINSTANCE                        g_hInst = NULL;
  24. //////////////////////////////////////////////////////////////////////////////////////////


  25. //////////////////////////////////////////////////////////////////////////////////////////
  26. HWND NewWindow(PCTSTR Caption,UINT Left,UINT Top,UINT Width,UINT Height,HWND hParent, HFONT hFONT,DWORD dwStyle)
  27. {
  28.         HWND _hNewWindowBox = CreateWindow(TEXT("Button"),
  29.                 Caption,
  30.                 dwStyle,
  31.                 Left, Top, Width, Height,
  32.                 hParent,
  33.                 NULL,
  34.                 g_hInst,
  35.                 NULL);
  36.         if (_hNewWindowBox)
  37.         {
  38.                 SendMessage(_hNewWindowBox, WM_SETFONT, (WPARAM)hFONT, 0);
  39.         }
  40.         return _hNewWindowBox;
  41. }
  42. //////////////////////////////////////////////////////////////////////////////////////////


  43. //////////////////////////////////////////////////////////////////////////////////////////
  44. HWND NewButton(PCTSTR Caption,UINT Left,UINT Top,UINT Width,UINT Height,HWND hParent, HFONT hFONT,CONST DWORD uAddStyle = 0)
  45. {
  46.         return NewWindow(Caption,Left,Top,Width,Height,hParent,hFONT,BUTTON_STYLE|uAddStyle);
  47. }
  48. //////////////////////////////////////////////////////////////////////////////////////////

  49. //////////////////////////////////////////////////////////////////////////////////////////
  50. LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  51. {
  52.         static HWND hButton = NULL;
  53.         switch (uMsg)
  54.         {
  55.         case WM_CREATE:
  56.                 {
  57.                         HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  58.                         hButton = NewButton(STR_MessageBoxW,52,32,100,28,hWnd,hFont);
  59.                 }
  60.                 break;
  61.         case WM_DESTROY:
  62.                 PostQuitMessage(0);
  63.                 break;
  64.         case WM_COMMAND:
  65.                 if ((HWND)lParam == hButton)
  66.                 {
  67.                         MessageBoxW(hWnd,STR_MessageBoxW,STR_TEST,MB_OK);
  68.                 }
  69.                 break;
  70.         default:
  71.                 return DefWindowProc(hWnd, uMsg, wParam, lParam);
  72.         }
  73.         return S_OK;
  74. }
  75. //////////////////////////////////////////////////////////////////////////////////////////


  76. //////////////////////////////////////////////////////////////////////////////////////////
  77. HWND AppWindow(PCTSTR AppName,UINT Width,UINT Height,WNDPROC WndProc)
  78. {
  79.         WNDCLASSEX        sWndClassEx ={0};
  80.         sWndClassEx.cbSize = sizeof(WNDCLASSEX);
  81.         sWndClassEx.style = (CS_VREDRAW | CS_HREDRAW);
  82.         sWndClassEx.lpfnWndProc = WndProc;
  83.         sWndClassEx.hInstance = g_hInst;
  84.         sWndClassEx.hCursor = LoadCursor(0, IDC_ARROW);
  85.         sWndClassEx.hbrBackground = (HBRUSH)(COLOR_BTNSHADOW);       
  86.         sWndClassEx.lpszClassName = (LPCWSTR)AppName;
  87.         if (RegisterClassEx(&sWndClassEx))
  88.         {
  89.                 UINT x,y;               
  90.                 x = (GetSystemMetrics(SM_CXSCREEN) - Width)/2;
  91.                 y = (GetSystemMetrics(SM_CYSCREEN) - Height)/2;
  92.                 return CreateWindow(AppName,
  93.                         AppName,
  94.                         WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
  95.                         x,y,
  96.                         Width,Height,
  97.                         NULL, NULL,
  98.                         g_hInst, NULL);
  99.         }
  100.         else
  101.         {
  102.                 return NULL;
  103.         }
  104. }
  105. //////////////////////////////////////////////////////////////////////////////////////////


  106. //////////////////////////////////////////////////////////////////////////////////////////
  107. INT WINAPI EntryPoint(HINSTANCE hInstance,HINSTANCE hPrevInstance,PTSTR lpCmdLine,INT nShowCmd)
  108. {
  109.         if (AppWindow(STR_TEST,200,120,WindowProc))
  110.         {
  111.                 MSG sMsg;
  112.                 while (GetMessage(&sMsg, NULL, 0, 0))
  113.                 {
  114.                         TranslateMessage(&sMsg);
  115.                         DispatchMessage(&sMsg);
  116.                 }
  117.         }
  118.         return S_OK;
  119. }
  120. //////////////////////////////////////////////////////////////////////////////////////////
复制代码

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-6-9 10:57:50 | 显示全部楼层
前者是Win32版本(来自VC6)

太老了!!!很多新函数没有添加,比如GetProcessId、IsWow64Process等等。

7

主题

36

回帖

2

精华

初来乍到

积分
3171
 楼主| 发表于 2011-6-9 17:07:35 | 显示全部楼层
哈哈,人说紫水晶编程论坛的版主会转帖,今天本人领略了。
#include <Windows.h>
添加了头文件 Windows.h,你所说的那几个函数就可以用了,且你说的
那两个函数不是在MSVCRT.DLL中,而在Kernel32.dll中,看一下微软的文档吧
http://msdn.microsoft.com/en-us/library/ms684139(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ms683215(v=vs.85).aspx

本人发这个主题的目的是说明如何链接到 MSVCRT.LIB,以减小EXE的体积,
这个模板也适用于64位EXE代码,你再看看你论坛的这个主题吧:
http://www.m5home.com/bbs/thread-5010-1-1.html
要VC2005以后,包括VC2008、VC2010,如果
#pragma comment(lib, "MSVCRT.LIB")
这个"MSVCRT.LIB"找不对,EXE文件必定需要 msvcr1xx.dll,而不是msvcrt.dll。
既然认为没有价值,本人也将源码删了,只保留EXE文件,你用 depends22_x64看下
这两个EXE(X86的是2K、X64的是3K),需要什么DLL。





30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-5-20 13:01:30 | 显示全部楼层
代码好必须顶
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表