傳統學習路徑「C → C++ → 汇編 → VC++」耗時漫長。事實上,掌握C基礎並理解基本C++類概念後,即可直接切入Windows C編程。本文以「最小化知識集」帶你快速上手:從經典 MessageBox 入門,到調用Winsock API獲取本機主機名與IP地址,並詳述VC++6.0項目配置全流程。
| 類型 | 主函數簽名 | 輸出方式 |
|---|---|---|
| 標準C控制台 | main() / main(int argc, char* argv[]) | printf() 直接輸出標準輸出 |
| Windows GUI | WinMain(HINSTANCE, HINSTANCE, LPSTR, int) | 調用Windows API(如MessageBox)在獨立窗口顯示 |
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
MessageBox(NULL, "Hello,World!", "第一個Windows C程序", MB_OK | MB_ICONASTERISK);
return 0;
}
四大參數詳解:
hInstance:當前實例句柄hPrevInstance:前一實例句柄(Win32中恒為NULL)lpCmdLine:命令行參數字符串nCmdShow:窗口顯示方式(最大化/最小化/正常)MessageBox原型:int MessageBox(HWND, LPCTSTR, LPCTSTR, UINT)——父窗口、文本、標題、圖標類型。
句柄非指針,而是系統內部表索引值。它屏蔽了對象內存地址變動(如窗口移動導致內存塊重定位),提供穩定的訪問入口。使用時可視為「不透明指針」。
wsock32.libVC++6.0中:Project → Settings → Link → Object/Library modules 添加 wsock32.lib,否則鏈接報錯 LNK2001。
| 函數 | 用途 | 關鍵參數/返回值 |
|---|---|---|
WSAStartup(WORD, LPWSADATA) | 初始化Winsock,指定版本(如0x0101) | 成功返回0 |
WSACleanup() | 釋放Winsock資源 | 無返回值 |
gethostname(char*, int) | 獲取本機主機名 | 緩衝區指針、大小;成功返回0 |
gethostbyname(const char*) | 由主機名查詢 hostent 結構 | 返回 struct hostent*,含IP列表 |
hostent 結構關鍵字段struct hostent {
char FAR *h_name; // 官方主機名
char FAR FAR **h_aliases; // 別名列表
short h_addrtype; // 地址類型(PF_INET)
int h_length; // 地址長度(IPv4為4)
char FAR FAR **h_addr_list; // IP地址列表(網絡序)
};
本機IP即 h_addr_list[0] 的4字節,需轉換為點分十進制顯示。
#include <winsock.h>
int WSA_return; WSADATA WSAData; HOSTENT *host_entry;
char host_name[256], host_address[256];
int APIENTRY WinMain(...) {
WSA_return = WSAStartup(0x0101, &WSAData);
if (WSA_return == 0) {
gethostname(host_name, 256);
host_entry = gethostbyname(host_name);
if (host_entry) {
wsprintf(host_address, "%d.%d.%d.%d",
(host_entry->h_addr_list[0][0] & 0xFF),
(host_entry->h_addr_list[0][1] & 0xFF),
(host_entry->h_addr_list[0][2] & 0xFF),
(host_entry->h_addr_list[0][3] & 0xFF));
MessageBox(NULL, host_address, host_name, MB_OK);
}
}
WSACleanup(); return 0;
}
Get_IP.h 聲明 BOOL APIENTRY Hostname_ipDlgPro(...)DIALOG1,放置兩個編輯框(IDC_EDIT1 主機名,IDC_EDIT2 IP)WinMain 中調用 DialogBox(hInstance, "DIALOG1", NULL, (DLGPROC)Hostname_ipDlgPro)WM_INITDIALOG(設置文本)、WM_COMMAND(關閉)F:\,名稱 Get_IPGet_IP.c) / C/C++ Header File (Get_IP.h)Get_IP.rc) → Insert → Resource → Dialog → 編輯界面Ctrl+F7 編譯,F7 鏈接(資源文件同步編譯),Ctrl+F5 運行。別忘鏈接 wsock32.lib!| 維度 | Windows C (SDK風格) | Visual C++ (MFC/ATL) |
|---|---|---|
| 源碼量 | 較大 | 較小(框架封裝) |
| 開發難度 | 高(需懂API細節) | 低(向導生成樣板) |
| 可執行文件體積 | 小 | 大 |
| 運行速度 | 快 | 略慢 |
| 適用場景 | 網絡、驅動、高性能、底層 | 通用GUI、快速原型、企業級應用 |