怎樣使用 Visual C++ 編譯出只有 1536 位元組的視窗程式 (轉)
怎樣使用 Visual C++ 編譯出只有 1536 位元組的視窗程式 (轉)[@more@]//題目:怎樣使用 Visual C++ 編譯出只有 1536 位元組的視窗
//這些技巧都是dREAMtHEATER老大哥告我的……
//編譯出來後,大小為: 1536 位元組
////////////////////////////////////////////////////////////////////////////////////////////////////
//預處理
#include <.h>
//使用了下面的預處理,編譯連線時必須是 Release 方式,否則不能透過
//自定義程式入口,如果要,推薦使用這個
//如果使用 VS,也可以這樣設定:在“解決方案管理器”裡選定專案,右擊,選擇“屬性”->“連結器”->“高階”->“入口點”
//6裡面也有類似的設定,但具體不記得了
//專案屬性的其它設定可以仔細看看,其它最佳化也都在這裡可以設定
#pragma comment(linker, "/ENTRY:EntryPoint")
//下面是調整段對齊,預設是 4K,在 下能更快地裝入 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 WIN WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow);
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//入口函式
//使用我們自己的入口函式,而不用聯結器預設提供的一大堆程式初始化操作的程式碼
//為了在一個普通的 SDK 程式裡能使用這種方法,下面的函式將 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);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//這些技巧都是dREAMtHEATER老大哥告我的……
//編譯出來後,大小為: 1536 位元組
////////////////////////////////////////////////////////////////////////////////////////////////////
//預處理
#include <.h>
//使用了下面的預處理,編譯連線時必須是 Release 方式,否則不能透過
//自定義程式入口,如果要,推薦使用這個
//如果使用 VS,也可以這樣設定:在“解決方案管理器”裡選定專案,右擊,選擇“屬性”->“連結器”->“高階”->“入口點”
//6裡面也有類似的設定,但具體不記得了
//專案屬性的其它設定可以仔細看看,其它最佳化也都在這裡可以設定
#pragma comment(linker, "/ENTRY:EntryPoint")
//下面是調整段對齊,預設是 4K,在 下能更快地裝入 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 WIN WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow);
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//入口函式
//使用我們自己的入口函式,而不用聯結器預設提供的一大堆程式初始化操作的程式碼
//為了在一個普通的 SDK 程式裡能使用這種方法,下面的函式將 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);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1008670/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 怎樣使用 Visual C++ 編譯出只有 1536 位元組的視窗程式C++編譯
- 情有獨鍾C++:Visual C++ .NET編譯器的新特性(轉)C++編譯
- 位元組編碼轉換
- 呼叫Visual Studio的cl.exe編譯C/C++程式編譯C++
- python反編譯之位元組碼Python編譯
- 在Visual C++中使用內聯彙編 (轉)C++
- 在Visual C++中使用內聯彙編(轉)C++
- Java程式碼如何檢視位元組碼及彙編碼Java
- JWebAssembly:Java 位元組碼到 WebAssembly 編譯器WebJava編譯
- 用Visual C++編寫電子郵件程式 (轉)C++
- Win10系統總是彈出microsoft visual c++ runtime library視窗怎麼辦Win10ROSC++
- c/c++使用位元組時,易出錯點梳理總結C++
- 【C++】C++的位元組對齊C++
- Visual C++ 6.0的文件/視結構 (轉)C++
- Visual C++ 6.0 編 程 經 驗 (轉)C++
- 編譯C++ 程式的過程編譯C++
- protobuf 的交叉編譯使用(C++)編譯C++
- JSP中怎樣傳遞引數到彈出視窗?JS
- C++ 位元組對齊C++
- 如何在Visual Studio和CodeBlocks中反編譯C++程式碼BloC編譯C++
- 使用ZendEncode編譯PHP程式(轉)編譯PHP
- linux 改變GCC編譯器的位元組對齊方式LinuxGC編譯
- 彈出視窗程式碼
- 【C/C++】5.位元組對齊和位元組填充C++
- win10彈出視窗阻止程式在哪_win10視窗阻止程式怎麼設定Win10
- JavaScript視窗功能指南之建立彈出視窗 (轉)JavaScript
- 在Visual C++中使用內聯彙編C++
- c/c++ 位元組對齊C++
- C/C++位元組詳解C++
- C++與Qt的位元組序探究:C++QT
- 字元,位元組和編碼字元
- 用Visual Studio將Objective-C編譯為C++Object編譯C++
- C語言檢視變數位元組程式C語言變數
- 利用BCB編寫具有"磁性"特徵的視窗 (轉)特徵
- 在Visual Basic 中使用C++ 類 (轉)C++
- 如何加快C++程式碼的編譯速度C++編譯
- idea 開啟自動編譯以及檢視Problem視窗Idea編譯
- 【編譯製導指令】#pragma pack - 位元組數基準對齊編譯