话就不多说了,你一定能看懂。这里运行时库一定要指定为"多线程/MT",否则最后Release版本的程序在其他机器上无法运行.
命令行 /MT 或
这里指定自定义入口函数名 命令行 /entry:Start 或
//Win32控制台程序
//----------------------------------------------
//stdafx.h file
//----------------------------------------------
#pragma once
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include <Windows.h>
//----------------------------------------------
//console.cpp
//----------------------------------------------
#include "stdafx.h"
HANDLE hStdIn;
HANDLE hStdOut;
BOOL __stdcall CtrlHandler(DWORD CtrlType)
{
if(CtrlType==CTRL_C_EVENT || CtrlType==CTRL_BREAK_EVENT)
CloseHandle(hStdIn);
return TRUE;
}
void Start()
{
hStdIn = GetStdHandle(STD_INPUT_HANDLE);
hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleMode(hStdIn,ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT|ENABLE_PROCESSED_INPUT);
SetConsoleCtrlHandler(CtrlHandler,TRUE);
HANDLE hHeap = GetProcessHeap();
PVOID szBuffer = HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1024);
DWORD dwBytesRead,dwBytesWrite;
while(TRUE){
if(!ReadConsole(hStdIn,szBuffer,1024,&dwBytesRead,NULL) || ((char*)szBuffer)[0] == 'q' )
break;
WriteConsole(hStdOut,szBuffer,dwBytesRead,&dwBytesWrite,NULL);
}
HeapFree(hHeap,HEAP_NO_SERIALIZE,szBuffer);
ExitProcess(0);
}
//Windows程序
//----------------------------------------------------
//stdafx.h
//----------------------------------------------------
#ifndef WINVER
#define WINVER 0x0501
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0410
#endif
#ifndef _WIN32_IE
#define _WIN32_IE 0x0600
#endif
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
//----------------------------------------------------
// winapp.cpp
//----------------------------------------------------
#include "stdafx.h"
void __stdcall Start()
{
MessageBoxA(NULL,"Hello World!","?",MB_OK);
ExitProcess(0);
}
// Release版本
//制作Win32 - DLL文件的方法与前面相同以上仅使用
Windows标准库,最后生成的程序只有 3KB大小,基本上和汇编写的程序大小差不多了.
如果要再小点,我们可以把 只读数据、导入表以及导出表节.rdata与代码节.text合并。(这里提到的节区是以VC编译器为准,不同的编译器对节的命名也许会有些不同)
连接器命令行添加
/merge:.rdata=.text 或 现在再看看大小 :( 2KB 了。