windows編程的常識?1.調用約定,WINAPI CALLBACK __stdcall _cdecl 2. unicode與utf-8區别,我來為大家科普一下關于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每日頭條,我们将持续为您更新最新资讯!