?Windows API 介紹及核心函數分類表

Windows API 介紹?

Windows API(Application Programming Interface),也稱為WinAPI,是微軟Windows操作系統的核心編程接口。它提供了一系列函數、消息、數據結構、宏和系統服務,允許開發者創建運行在Windows平臺上的應用程序。

1. ?歷史與演變?

?Win16 API?:最早用于16位的Windows 1.0到3.1。
?Win32 API?:隨著32位Windows NT的出現而引入,成為現代Windows開發的基礎。它支持32位和64位系統。
?Win64 API?:本質上與Win32相同,但在指針和數據類型上進行了調整以適應64位架構。
?Windows RT API?:用于ARM架構的Windows版本,如Windows RT(已停止支持)。
?Windows API 的新發展?:隨著Windows 10和11的發布,微軟引入了Windows Runtime(WinRT),這是一套新的API,設計用于現代應用(UWP應用)。WinRT基于COM,并通過語言投影(如C++/WinRT, C#)使用。

2. ?主要組成部分?

Windows API涵蓋多個領域,主要包括:
?基礎服務(Kernel)??:文件系統、進程和線程管理、內存管理、設備I/O等(如Kernel32.dll)。
?用戶界面服務(User)??:窗口管理、消息隊列、控件等(如User32.dll)。
?圖形設備接口(GDI)??:圖形繪制,文本渲染,位圖處理(如Gdi32.dll)。但請注意,現代圖形推薦使用DirectX或Direct2D/DirectWrite。
?高級服務?:注冊表操作(Advapi32.dll)、安全服務、服務控制管理器(SCM)等。
?其他API?:網絡(Winsock)、多媒體、遠程過程調用(RPC)等。

3. ?核心概念?

?句柄(Handles)??:用于引用系統對象(如窗口、文件、進程等)的標識符。例如,HWND(窗口句柄)、HANDLE(通用句柄)。
?消息機制(Message Loop)??:Windows應用是事件驅動的。系統通過消息(如鼠標點擊、鍵盤輸入)與應用程序通信。應用程序通過消息循環處理消息。
?動態鏈接庫(DLL)??:Windows API函數大多封裝在DLL中,應用程序在運行時動態加載。

4. ?編程語言支持?

雖然Windows API本質上是基于C語言的接口,但可以通過不同語言使用:
?C/C++??:原生支持,直接調用API函數。
?C#/VB.NET?:通過平臺調用(P/Invoke)調用Win32 API,或者使用.NET框架的包裝類(如System.IO、System.Diagnostics等)。
?
其他語言
?:如Python(使用ctypes或pywin32)、Delphi等。

5. ?現代Windows開發?

?WinRT API?:用于通用Windows平臺(UWP)應用,支持跨設備(PC、Xbox、HoloLens等)。WinRT API通過元數據(.winmd)定義,可以從多種語言訪問(C++/WinRT, C#, JavaScript, VB)。
?**.NET框架/WPF/WinForms**?:這些是建立在Win32 API之上的高級框架,提供更易用的抽象。
?桌面應用與現代UI結合?:Windows 10/11允許傳統Win32應用使用現代API,如通過XAML Islands嵌入UWP控件。

6. ?開發工具?

?Visual Studio?:微軟官方IDE,提供完整的Windows開發環境。
?Windows SDK?:包含庫、頭文件、工具和文檔,用于開發Windows應用。
?Windows Driver Kit (WDK)??:用于驅動開發。

7. ?文檔與資源?

?Microsoft Docs?:官方文檔(https://docs.microsoft.com)是權威來源。
?MSDN(歷史資源)??:舊版文檔,但仍有參考價值。
?GitHub 示例?:微軟官方提供了許多示例代碼。

8. ?示例:創建一個窗口?

以下是一個使用C語言和Win32 API創建窗口的簡單示例:

#include <windows.h>LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {// 注冊窗口類const wchar_t CLASS_NAME[]  = L"Sample Window Class";WNDCLASS wc = { };wc.lpfnWndProc   = WindowProc;wc.hInstance     = hInstance;wc.lpszClassName = CLASS_NAME;RegisterClass(&wc);// 創建窗口HWND hwnd = CreateWindowEx(0,                              // 擴展樣式CLASS_NAME,                     // 類名L"Learn to Program Windows",    // 窗口標題WS_OVERLAPPEDWINDOW,            // 窗口樣式// 位置和大小CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL,       // 父窗口NULL,       // 菜單hInstance,  // 實例句柄NULL        // 附加數據);if (hwnd == NULL) {return 0;}ShowWindow(hwnd, nCmdShow);// 消息循環MSG msg = { };while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return 0;
}LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_DESTROY:PostQuitMessage(0);return 0;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}
}

9. ?安全注意事項?

在使用Windows API時,需要注意:
?權限提升?:避免不必要的管理員權限。
?緩沖區溢出?:使用安全的字符串函數(如StringCchCopy代替strcpy)。
?輸入驗證?:嚴格驗證來自用戶或網絡的數據。

10. ?未來趨勢?

微軟鼓勵使用現代API(如WinRT)和跨平臺框架(如MAUI),但Win32 API仍然是Windows底層開發的基石。

注意事項:?
?1、API 總數龐大?
Windows 11 SDK 包含 ?60,000+ 函數,實際開發只需掌握相關領域的核心函數。
2、?參數復雜性?
多數 API 有大量參數和錯誤碼處理(例如 CreateFile 有 ?7 個參數),需嚴格檢查返回值。
?3、Unicode 支持?
優先使用 Unicode 版本函數(如 CreateFileW 后綴 W),避免 ANSI 版本(CreateFileA)。
?4、安全替代方案?
舊 API 如 strcpy 已被安全版本 strcpy_s 取代。

Windows API 核心函數分類表

功能類別DLL庫API函數典型用法使用場景示例
?進程管理?kernel32.dllCreateProcess創建新進程并指定執行文件路徑啟動外部程序(如打開記事本)
kernel32.dllExitProcess終止當前進程程序退出時清理資源
?線程管理?kernel32.dllCreateThread創建新線程執行指定函數后臺任務并行處理
kernel32.dllWaitForSingleObject阻塞等待線程/進程結束同步多線程操作
?文件操作?kernel32.dllCreateFile創建/打開文件,返回句柄讀取、寫入或追加文件內容
kernel32.dllReadFile通過句柄讀取文件數據讀取配置文件內容
kernel32.dllWriteFile通過句柄寫入文件數據寫入日志文件
?內存管理?kernel32.dllVirtualAlloc在虛擬地址空間保留/提交內存分配大塊動態內存
kernel32.dllHeapAlloc從堆中分配內存(效率更高)頻繁申請小內存對象
?窗口管理?user32.dllCreateWindowEx創建帶有擴展樣式的窗口構建GUI應用主窗口
user32.dllShowWindow控制窗口顯示狀態(最小化/最大化)啟動時窗口初始化
?消息處理?user32.dllGetMessage從消息隊列獲取消息主消息循環處理用戶輸入
user32.dllSendMessage向指定窗口發送消息(同步)控件間通信(更新文本框)
?圖形繪制?gdi32.dllBitBlt位圖塊傳輸(快速復制圖像)屏幕截圖、雙緩沖繪圖
gdi32.dllTextOutW在設備上下文輸出Unicode文本在窗口上繪制文字
?網絡通信?ws2_32.dllsocket創建套接字描述符TCP/UDP網絡通信基礎
ws2_32.dllconnect連接遠程服務器客戶端發起HTTP請求
?注冊表操作?advapi32.dllRegOpenKeyEx打開指定注冊表鍵讀取HKEY_CURRENT_USER配置
advapi32.dllRegSetValueEx設置注冊表鍵的值保存用戶設置到系統
?系統信息?kernel32.dllGetSystemInfo獲取CPU/內存架構等硬件信息檢測系統是否支持64位
kernel32.dllGlobalMemoryStatusEx檢索物理/虛擬內存使用狀態監控內存占用率

高級功能代表 API

功能類別DLL庫API函數用法說明
?多媒體?winmm.dllPlaySound播放WAV音頻文件或系統音效
?加密服務?advapi32.dllCryptGenKey生成加密密鑰用于數據加解密
?COM組件?ole32.dllCoCreateInstance創建COM對象實例(如操作Word文檔)
?Shell操作shell32.dllShellExecuteEx執行文件關聯操作(用默認程序打開PDF)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88751.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88751.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88751.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kubernetes Dashboard UI 部署安裝

K8S 集群環境&#xff1a; Ubuntu 24 / K8S 1.28.21. 推薦使用helm 安裝Kubernetes Dashboardsudo snap install helm --classic2. 部署Kubernetes Dashboard# Add kubernetes-dashboard repository helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboar…

python-enumrate函數

文章目錄基本語法基本用法基本遍歷指定起始索引實際應用場景需要索引的循環創建字典映射處理文件行號與range(len())對比注意事項enumerate()是Python內置函數&#xff0c;用于在遍歷序列&#xff08;如列表、元組或字符串&#xff09;時同時獲取索引和值。基本語法 enumerate…

FPGA通信設計十問

1. FFT有什么用&#xff1f;FFT&#xff08;快速傅里葉變換&#xff09;是離散傅里葉變換&#xff08;DFT&#xff09;的高效實現算法&#xff0c;它的核心作用是快速將信號從時域轉換到頻域&#xff0c;從而簡化信號分析和處理的過程。自然界的信號&#xff08;如聲音、圖像、…

代理模式——Java

代理模式 在Java中代理模式是一種設計模式&#xff0c;是通過代理類來代替原始的對象&#xff0c;可以在不改變原始對象的基礎上&#xff0c;對它進行擴展&#xff08;新增一些新功能&#xff09;。在目標方法的執行的執行前后添加一些自定義的方法。 靜態代理 步驟&#xff1a…

基于Catboost算法的茶葉數據分析及價格預測系統的設計與實現

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目介紹數據采集數據預處理數據分析與可視化大屏設計模型構建系統展示每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主 項目介紹 本研究基于京東官網…

【數據庫基礎 1】MySQL環境部署及基本操作

目錄 一、MySQL部署 1.更新軟件包列表 2.查看合適的安裝包&#xff1a; 3.安裝MySQL 4.啟動數據庫服務并設置開機自啟 5.檢測MySQL當前狀態 6.配置文件修改 二、基本操作指令 1.登陸MySQL 2.創建用戶&修改用戶密碼 3.查看版本 4.退出MySQL 5.停止MySQL 6.數據…

(C++)任務管理系統(正式版)(迭代器)(list列表基礎教程)(STL基礎知識)

源代碼&#xff1a;#include <iostream> #include <list> #include <string>using namespace std;void menu(){cout<<"\n 任務管理系統 "<<endl;cout<<"1.添加普通任務"<<endl;cout<<"2.添加緊急任務…

創建uniapp項目引入uni-id用戶體系使用beforeRegister鉤子創建默認昵稱

需求描述 基于uniCloud開發項目&#xff0c;通常會使用用戶體系&#xff0c;uni-id就是基于uniCloud的用戶體系&#xff0c;滿足常規需要的賬號密碼注冊、登錄&#xff0c;微信登錄等快捷方式&#xff0c;如果使用uni-id自帶的uni-id-pages插件&#xff0c;賬號密碼注冊的話&a…

Opencv---深度學習開發

在OpenCV中進行深度學習開發&#xff0c;主要圍繞其dnn模塊展開&#xff0c;該模塊支持加載預訓練模型、預處理輸入數據、執行推理計算以及解析輸出結果。本文講解基于OpenCV進行深度學習開發的基本流程。 一、準備工作 在開始開發前&#xff0c;需完成環境配置和資源準備&…

【C++11】右值引用詳解

文章目錄前言1. 左、右值的概念1.1 左值1.2 右值1.3 右值引用2. 右值引用的價值和使用場景2.1 左值引用的價值和缺陷2.2 右值引用的價值和使用場景2.3 小結3. 完美轉發4. 類的移動構造和移動賦值前言 在C11之前&#xff0c;面對C11之前出現的臨時對象的傳參構造&#xff0c;都…

如何用自指理解世界

自指即自我指涉&#xff0c;即自己的描述關聯到了自己&#xff0c;典型例子是“這句話是假話”這個悖論。人類對自指的研究由來已久&#xff0c;很多概念、定理都與之相關&#xff0c;由于它的巧妙性&#xff0c;很多學者對其展開了深入研究&#xff0c;并且認為自指是理解宇宙…

Next.js 實戰筆記 2.0:深入 App Router 高階特性與布局解構

Next.js 實戰筆記 2.0&#xff1a;深入 App Router 高階特性與布局解構 上一篇筆記&#xff1a; Next.js 實戰筆記 1.0&#xff1a;架構重構與 App Router 核心機制詳解 上篇筆記主要回顧了一些 Next12 到 Next15 的一些變化&#xff0c;這里繼續學習/復習一些已有或者是新的…

TCP 傳輸時 sk_buff 的 clone 和 unclone

周一有位朋友咨詢個問題&#xff0c;問題本身不重要&#xff0c;但牽扯出的細節卻是非常有趣。 Linux 內核協議棧的 skb 設計非常高效和精巧&#xff0c;多個 skb 可以指向同一塊 data&#xff0c;這就是 clone&#xff0c;當 data 不止一個 skb 指示時&#xff0c;任何一個 s…

【51單片機】51單片機學習筆記-課程簡介

00. 目錄 文章目錄00. 目錄01. 學習哪種類型的單片機02. 學習單片機方法03. 學習單片機硬件設備04. 學習單片機軟件設備05. 學完單片機能做什么06. 附錄01. 學習哪種類型的單片機 單片機的型號那么多&#xff0c;該如何選擇一款合適的進行學習呢&#xff1f;這里給讀者首推的當…

【Docker基礎】Docker端口映射(-p參數)深度解析與實踐指南

目錄 前言 1 Docker網絡基礎 1.1 Docker網絡模型概述 1.2 容器網絡隔離性 2 端口映射基礎 2.1 端口映射概念 2.2 為什么需要端口映射 3 -p參數詳解 3.1 基本語法 3.2 四種映射格式 3.2.1 完整格式 3.2.2 省略宿主機IP 3.2.3 隨機宿主機端口 3.2.4 指定協議類型 …

2、鴻蒙Harmony Next開發:ArkTS語言

目錄 什么是ArkTS&#xff1f; ArkTS的發展趨勢 ArkTS的定位及約束 ArkTS的對UI的拓展 1、UI描述 2、狀態管理&#xff1a; ArkTS語法基礎 基本知識&#xff1a;聲明 基本知識&#xff1a;類型 基本知識&#xff1a;空安全 基本知識&#xff1a;類型安全與類型推斷 …

【Elasticsearch】function_score

如果你希望在 Elasticsearch 查詢中降低某些特定 `id` 的文檔評分,可以通過 `function_score` 查詢結合 `script_score` 函數來實現。`script_score` 允許你使用自定義腳本對文檔的評分進行調整。 以下是一個示例,展示如何降低某些特定 `id` 的文檔評分: 示例場景 假設我們…

vscode打開stm32CubeIDE的項目的注釋問題

文章目錄 目的是為消除紅色底線打開命令面板&#xff1a;CtrlShiftP 搜索并打開&#xff1a;C/C: Edit Configurations (JSON) 修改并添加。&#xff08;注意里面的版本號&#xff09; {"configurations": [{"name": "Win32","includePath&…

ESP32使用freertos更新lvgl控件內容

LVGL不是線程安全&#xff0c;所有 lv_xxx方法只能在GUI主線程調用。 freertos都是線程池&#xff0c;子線程&#xff0c;不能直接更新lvgl&#xff0c;不然看門狗被觸發&#xff0c;死機。 推薦方法案例&#xff1a; 假如搜索wifi列表得到參數是wifi_options&#xff0c;需要通…

OBOO鷗柏丨滿天星(MTSTAR)多媒體信息發布系統技術解析

初次啟動歡迎您使用鷗柏(OBOO)滿天星(MTSTAR)多媒體信息發布系統&#xff0c;在使用本系統的獨立服務器模式前&#xff0c;我們需要完成設備的一些必須設置教程技術說明。其總體流程分為兩步&#xff1a;錄入本地服務器IP地址->連接網絡您獲取到的OBOO鷗柏滿天星(MTSTAR)液晶…