加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

#pragma comment 用法

(2012-06-09 17:56:24)
标签:

杂谈

分类: 编程相关
添加关键代码在这里:

#pragma comment(linker, "/align:512") //对齐方式改为512字节
#pragma comment(linker, "/MERGE:.data=.text")   //合并.data Section 到 .text
#pragma comment(linker, "/MERGE:.rdata=.text") //合并.rdata Section 到 .text
#pragma comment(linker, "/ENTRY:entry") //指定入口函数可去掉启动代码减小体积,而且可以让查壳工具识别不出来。
然后在网上查了下找到了Yonsm(http://www.pediy.com/bbshtml/BBS5/pediy50453.htm)的一篇帖子,那里有1.5K窗口程序的代码。

如果你用VC自动生成的简单窗口代码,采用Release编译生成程序大小是40K,添加关键代码后是5.5K,还没有达到1.5,原来程序有一个.rsrc段。不要icon,也就是没有资源块,合成一个区块可以达到要求。

用Yonsm的代码直接Release直接生成1.5K的,PEID显示Nothing fonund*.不需要加壳,已经是最小的了,加了就不能运行了。

附:#pragma comment 用法

#pragma comment( ,"] )
 
comment-type是一个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker之一。
/DEFAULTLIB

/EXPORT

/INCLUDE

/MANIFESTDEPENDENCY

/MERGE

/SECTION

(1)/DEFAULTLIB:library
 
/DEFAULTLIB 选项将一个 library 添加到 LINK 在解析引用时搜索的库列表。用 /DEFAULTLIB 指定的库在命令行上指定的库之后和 .obj 文件中指定的默认库之前被搜索。

忽略所有默认库 (/NODEFAULTLIB) 选项重写 /DEFAULTLIB:library。如果在两者中指定了相同的 library 名称,忽略库 (/NODEFAULTLIB:library) 选项将重写 /DEFAULTLIB:library。


(2)/EXPORT:entryname[,@ordinal[,NONAME]][,DATA]


使用该选项,可以从程序导出函数,以便其他程序可以调用该函数。也可以导出数据。通常在 DLL 中定义导出。entryname 是调用程序要使用的函数或数据项的名称。NONAME 关键字只将函数导出为序号,没有 entryname。


DATA 关键字指定导出项为数据项。客户程序中的数据项必须用 extern __declspec(dllimport) 来声明。

有三种导出定义的方法,按照建议的使用顺序依次为:



    

    
源代码中的 __declspec(dllexport)


    

    

    
.def 文件中的 EXPORTS 语句


    

    

    
LINK 命令中的 /EXPORT 规范


    


所有这三种方法可以用在同一个程序中。LINK 在生成包含导出的程序时还创建导入库,除非生成中使用了 .exp 文件。

LINK 使用标识符的修饰形式。编译器在创建 .obj 文件时修饰标识符。如果 entryname 以其未修饰的形式指定给链接器(与其在源代码中一样),则 LINK 将试图匹配该名称。如果无法找到唯一的匹配名称,则 LINK 发出错误信息。当需要将标识符指定给链接器时,请使用 Dumpbin 工具获取该标识符的修饰名形式。


(3)/INCLUDE:symbol

/INCLUDE 选项通知链接器将指定的符号添加到符号表。


若要指定多个符号,请在符号名称之间键入逗号 (,)、分号 (;) 或空格。在命令行上,对每个符号指定一次 /INCLUDE:


我们经常用到的是#pragma comment(lib,"*.lib")这类的。

#pragma comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库。 

和在工程设置里写上链入Ws2_32.lib的效果一样,不过这种方法写的程序别人在使用你的代码的时候就不用再设置工程settings了


 


标 题:怎样使用 Visual C++ 编译出只有 1536 字节的窗口程序


时 间:02/09/20 08:20pm

详细信息: 



//题目:怎样使用 Visual C++ 编译出只有 1536 字节的窗口程序 

//这些技巧都是dREAMtHEATER老大哥告我的…… 

//编译出来后,文件大小为: 1536 字节 





//////////////////////////////////////////////////////////////////////////////////////////////////// 

//预处理 

#include <Windows.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); 


////////////////////////////////////////////////////////////////////////////////////////////////////

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有