原创 WIN32 使用事件實現高效生產者消費者模型

WIN32 如何實現線程同步 WIN32 多線程編程中,可以使用臨界區(CRITICAL_SECTION)和互斥體(MUTEX)實現線程互斥。但是對於同步問題,如果用上述兩種方法實現,效率比較低,原因是它們必須通過條件判斷來決定是

原创 Win32 Edit 文本框追加字符串

有效,但低效。 // 向 Edit 控件追加字符串 void AddText(HWND hEditControl, LPCTSTR szNewStr) { // 獲取當前控件內的字符數 int nTextLen = Ge

原创 LPCTSTR 與 int 的互相轉換

就是宏。 #include <stdio.h> #include <tchar.h> #include <windows.h> #include <STDLIB.H> int main() { LPCTSTR s1 = TEX

原创 OpenProcess 拒絕訪問的解決辦法

並不是說有了管理員權限就能爲所欲爲,有時還需要將進程權限提升爲DEBUG。 // 提權函數:提升爲DEBUG權限 BOOL EnableDebugPrivilege() { HANDLE hToken; BOOL fOk=FA

原创 VC6程序申請管理員權限

要以管理員身份運行,需要添加資源文件,類型是24,ID是1,然後粘貼如下內容 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn

原创 消息斷點+內存斷點定位窗口過程

在調試比較複雜的Win32程序時,要找到窗口過程並不容易,OD提供了兩個工具:消息斷點和內存斷點,善用這兩個工具可以大大提高調試的效率。 消息斷點是給指定的消息設置斷點,本質還是條件斷點;內存斷點有訪問斷點和修改斷點,本文使用的是

原创 遍歷進程+遍歷模塊

遍歷進程有多種方法,我是用的是 CreateToolhelp32Snapshot 進程快照的方式;遍歷模塊我用的是 Process Status Helper 的函數,VC6需要下載 psapi.h 和相應的靜態庫文件,我已經上傳

原创 解析資源表

一、資源表簡介 資源表是PE所有表裏邊最複雜的表,造成資源表複雜是有歷史原因的,簡單說就是微軟設計PE的時候錯誤的以爲只要定義16中資源類型就夠了,後來發現遠遠不夠,但是PE結構已經定下來了,只能在原有基礎上修改,因此就造成了資源

原创 OPENFILENAME文件類型過濾 lpstrFilter

文檔上說,這個過濾字符串要以兩個NULL結尾。 舉例說明:如果希望只能打開PE文件,如 .exe .dll 等,可以這樣設置 LPCTSTR szPeFileExt = TEXT("PE File\0*.EXE;*.DLL;*.

原创 使用 _tprintf 宏兼容多字節字符集和Unicode字符集

我們知道在windows平臺上寫C程序要考慮字符編碼問題,爲了兼容多字節字符集和Unicode,涉及字符,字符串操作,都要用TEXT宏圍起來。 如果要使用printf,但是不確定字符集,可以使用 _tprintf 宏,編譯時自動根

原创 使用資源文件繪製Win32對話框

以前一直以爲Win32不能拖控件,現在才知道原來是可以的。 本文演示使用VC6創建一個基於對話框的Win32程序,界面使用資源文件繪製。 創建一個Win32應用程序 創建對話框資源文件 點擊 File -> New -> R

原创 在Windows C程序中使用Unicode編碼

一、Unicode字符/字符串使用L前綴 在windows的C/C++項目中,如果要使用Unicode編碼,則必須在字符串或字符前加上’L’前綴,Unicode字符串以兩個0結尾\0\0。如果不加L前綴,則表示使用默認的擴展ASC

原创 我的第一個windows應用程序

創建一個windows應用程序,有以下基本步驟 創建窗口類 註冊窗口類 創建窗口 顯示窗口 消息循環 編寫窗口過程(消息處理函數) 代碼如下: // Win32_01.cpp : Defines the entry point

原创 解析導入表和IAT表

一、導入表的結構 導入表的結構看起來複雜,其實只是套娃,不要被它嚇到了。 導入表的定義如下: typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD

原创 解析綁定導入表

一、綁定導入表的作用 有些windows程序,如notepad,爲了提高加載速度,會直接把DLL中的函數地址寫入到IAT表,省去了加載時的計算。但是這樣會有兩個問題,第一,當DLL沒有佔住ImageBase時,IAT中的地址就是錯