tft每日頭條

 > 科技

 > windows編程的常識

windows編程的常識

科技 更新时间:2024-11-22 17:58:14

windows編程的常識?1.調用約定,WINAPI CALLBACK __stdcall _cdecl 2. unicode與utf-8區别,我來為大家科普一下關于windows編程的常識?下面希望有你要的答案,我們一起來看看吧!

windows編程的常識(windows核心編程筆記)1

windows編程的常識

1.調用約定,WINAPI CALLBACK __stdcall _cdecl

2. unicode與utf-8區别

3.文件映射創建大文件

4.win32:創建窗口類--設置窗口過程函數(可重入,關鍵),注冊窗口類,創建窗口,show,update, 消息循環(GetMessage, TranslateMessage 鍵盤類消息轉換, DispatchMessage-到窗口過程去處理), 系統消息隊列,窗口消息隊列

5.modal dlg 有自己獨立消息循環 - WinApp 的 InitInstance 返回 false .CFrameWnd 的 返回 true

int AFXAPI AFXWinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPTSTR lpCmdLine, int nCmdShow)

{

AfxWinInit(hInstance, hPrev, lpCmdLine, nCmdShow);

pApp->InitApplication();

pThread->InitInstance();// 模态框 返回 false 就goto InitFailure

pThread->Run();

InitFailure:

AfxWinTerm();

}

6.PeekMessage(結合 PumpMessage) 立即返回, GetMessage(等待直到有消息)。SendMessage() 是同步行為,PostMessage()異步

7.内核對象,SECURITY_ATTRIBUTE, 生存期可能長于産生其的進程 ,内核句柄是進程的概念,内核對象跨進程訪問(繼承,命名)

job,進程,線程,文件,文件映射,事件對象,信号量,互斥量 (都有安全屬性設置) 完成端口也是内核對象, 作業内核對象用IO完成端口實現

8.線程tls, piddata (堆上資源), GetLastError , 結構化異常處理(coredump) 基于線程的

9.用戶模式線程同步:interlockd函數、關鍵代碼段,旋轉鎖(一直占cpu,慎!),讀寫鎖,速度快.内核模式線程同步,慢,用戶模式切内核模式山下文切換耗時

10.信号量,互斥量。互斥量基于線程,互斥量内核對象的線程id如果為0,表示是觸發的. 互斥對象 有線程所有權概念。

11.OVERLAPPED 結構? 異步io, 完成端口,一般開啟工作線程 cpu_num*2,并發最多cpu_num個線程。

12.棧的地址是由高向低增長的.堆得地址增長方向是由低到高向上增長的。

13.頁面是一個内存單元,系統通過它來管理内存,x86,x64一般為4KB.VirtualAlloc 分配區域才能使用地址空間(調撥物理存儲器), reserving. 分配粒度 64KB 的正數倍(起始地址)

14.頁交換文件。映像,映射,空閑,私有

15.線程棧默認1M, 調撥1個存儲頁面,區域頂部往下一個頁面為防護頁面

16.内存映射文件。 進程間數據共享 ,進程啟動快(exe,dll)節省也交換文件空間,訪問磁盤文件避免文件io操作和緩存

17.虛拟内存,文件映射,堆-内存操作控制的方法.堆就是一塊預定的地址空間區域,其物理存儲器始終是從頁交換文件中分配.堆上分配釋放慢

18.代碼段,堆棧段,數據段。

數據段(靜态存儲區):包括BSS段(Block Started by Symbol)的數據段。BSS段存儲未初始化或初始化為0的全局變量、靜态變量,具體體現為一個占位符,并不給該段的數據分配空間,隻是記錄數據所需空間的大小。數據段存儲經過初始化的全局和靜态變量。

19.鈎子實際上是一個處理消息的程序段,通過系統調用,把它挂入系統。每當特定的消息發出,在沒有到達目的窗口前,鈎子程序就先捕獲該消息,亦即鈎子函數先得到控制權。這時鈎子函數即可以加工處理(改變)該消息,也可以不作處理而繼續傳遞該消息,還可以強制結束消息的傳遞。

鈎子的類型總共15種,每種鈎子處理不同的消息

鈎子用SetWindowsHookEx安裝,放在DDL中,有全局鈎子的,比如鍵盤,鼠标等,也可以是線程的,指定窗口的(不是很準确,但實用)。是全局還是指定,主要是看SetWindowsHookEx中的參數設置:

全局時:第三個參數為DLL的hInstance,第四個參數為NULL。 DLL 注入

線程時:第三個參數NULL。

指定時:第三個參數為DLL的hInstance,第四個參數為為dwThreadId是指定窗口線程ID,這樣你就能獲得指定窗口的消息了。

想調用 SetWindowsHookEx 來設置 WH_CBT 鈎子,但我了解到 MFC 也安裝了這個鈎子,也就是在一個線程中安裝了兩次 WH_CBT,這樣做能行嗎? 答案是肯定的

CBT 鈎子的目的是監視窗口的創建,以便在該窗口接收到任何消息之前将 CWnd 對象連接到它們的 HWNDs

HHOOK WINAPI SetWindowsHookEx(

__in int idHook, \鈎子類型

__in HOOKPROC lpfn, \回調函數地址

__in HINSTANCE hMod, \實例句柄

__in DWORD dwThreadId); \線程ID

20.線程狀态是一個保存線程級全局變量的地方

void AFXAPI AfxHookWindowCreate(CWnd* pWnd)

{

_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();

pThreadState->m_hHookOldCbtFilter = ::SetWindowsHookEx(

WH_CBT, _AfxCbtFilterHook, NULL, ::GetCurrentThreadId());

pThreadState->m_pWndInit = pWnd;

}

21.線程消息隊列;沒有窗口也有消息隊列的

22.動态tls, TlsAlloc TlsSetValue, TlsGetValue, TlsFree

靜态tls __declspec(thread) DWORD gt_dwStartTime = 0

23.dll注入, api攔截

24.要切換不同的線程,操作系統應先切換該線程所隸屬之進程的内存(譯注),然後恢複該線程放在CONTEXT 結構中的寄存器值。這整個過程便稱為 context switch。

25. “線程核心對象”引用到的那個線程也會令核心對象開啟。因此,線程對象的默認引用計數是2。當你調用CloseHandle( )時,引用計數下降1,當線

程結束時,引用計數再降1。隻有當兩件事情都發生了(不管順序如何)的時候,這個對象才會被真正清除。線程的handle 是指向“線程核心對象”,而不是指向線程本身

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved