『壹』 對於一個只懂C語言得人來說,怎麼理解句柄
句柄是一個序號, 它不是一個內存地址。
它用於管理Windows內核對象,比如用戶打開一個文件,Windows即會建立一個文件內核對象,所謂內核對象就是一塊內存結構,裡面有文件路徑,文件大小,當前文件指針等等信息。Windows系統會打開很多的文件,因此就有很多的文件內核對象,同樣Windows系統還會建立其它的類型的很多很多的內核對象。如何管理這么多的內核對象 呢?Windows通過建立一個叫做句柄表的東西,用於記錄內核對象的地址。表中每一個元素,都是一個內核對象的起始地址,然後給每一個對象對應一個序號,此序號即為句柄。
//句柄表類似於下面的結構,像0、1、2這樣的序號即為句柄
----------------------------------------------------
0第一個內核對象的地址
1第二個內核對象的地址
2第三個內核對象的地址
----------------------------------------------------
『貳』 C語言中HANDLE是什麼
你問我會解釋不?你問的問題本身就是錯的,HANDLE和C語言沒有一毛錢的關系。拿Windows來說,句柄是操作系統本身提供的一組對對象進行操作的「把手」,比如文件對象,事件對象,設備對象……一般在內核中都有引用計數,操作前打開句柄,不用了就關閉(這些是內核對象,和一般意義上的句柄不同,比如窗口句柄,實例句柄不些不是內核對象)。新手剛學這個你只管用。想更深層次的理解去學系統底層吧。
『叄』 C語言中的HANDLE怎麼使用
除了各種API函數之外,句柄(HANDLE)沒有使用必要。
當一個函數要求句柄作為參數時,如果不是強調屬性的函數,傳遞一個NULL就行了。
否則以WinMain作為主函數,將主調函數的基礎參數hInstance作為句柄傳入。
『肆』 c++中的句柄是什麼意思
VC編程——句柄篇
句柄概念在WINDOWS編程中是一個很重要的概念,在許多地方都扮演著重要的角色。但由此而產生的句柄概念也大同小異,比如:<<Microsoft Windows 3 Developer's Workshop>>(Microsoft Press,by Richard Wilton)一書中句柄的概念是:在Windows環境中,句柄是用來標識項目的,這些項目包括:
*.模塊(mole)
*.任務(task)
*.實例(instance)
*.文件(file)
*.內存塊(block of memory)
*.菜單(menu)
*.控制(control)
*.字體(font)
*.資源(resource),包括圖標(icon),游標(cursor),字元串(string)等
*.GDI對象(GDI object),包括點陣圖(bitmap),畫刷(brush),元文件(metafile),調色板(palette),畫筆(pen),區域(region),以及設備描述表(device context)。
WINDOWS程序中並不是用物理地址來標識一個內存塊,文件,任務或動態裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,並將句柄返回給應用程序,然後通過句柄來進行操作。
在<<WINDOWS編程短平快>>(南京大學出版社)一書中是這么說的:句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,點陣圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。
從上面的2個定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之後其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。在WINDOWS編程中會用到大量的句柄,比如:HINSTANCE(實例句柄),HBITMAP(點陣圖句柄),HDC(設備描述表句柄),HICON(圖標句柄)等等,這當中還有一個通用的句柄,就是HANDLE,比如下面的語句:
HINSTANCE hInstance;
可以改成:
HANDLE hInstance;
上面的2句語句都是對的。
一個WINDOWS應用程序可以用不同的方法獲得一個特定項的句柄。許多API函數,諸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一個句柄值。另外,WINDOWS也能通過應用程序的引出函數將一個句柄作為參數傳送給應用程序,應用程序一旦獲得了一個確定項的句柄,便可在WINDOWS環境下的任何地方對這個句柄進行操作。其實句柄的大量使用已經影響到了每一個WINDOWS的程序設計。
句柄只有當唯一的確定了一個項目的時候,它才開始有意義。句柄對應著項目表中的一項,而只有WINDOWS本身才能直接存取這個表,應用程序只能通過API函數來處理不同的句柄,舉個例子來說吧!比如:我們可以為我們的應用程序申請一塊內存塊,通過調用API函數GlobalAlloc,來返回一個句柄值:
hMem=GlobalAlloc(......);
其實現在hMem的值只是一個索引值,不是物理地址,應用程序還不能直接存取這塊內存。這兒還有一個話外題,就是,一般情況下我們在編程的時候,給應用程序分配的內存都是可以移動的或者是可以丟棄的,這樣能使有限的內存資源充分利用,所以,在某一個時候我們分配的那塊內存的地址是不確定的,因為他是可以移動的,所以得先鎖定那塊內存塊,這兒應用程序需要調用API函數GlobalLock函數來鎖定句柄。如下:
lpMem=GlobalLock(hMem);
這樣應用程序才能存取這塊內存。
其實如果你學過SDK編程,那對句柄的概念理解會更好,更深。如果你是直接學VC6的MFC編程的,建議你看一下SDK編程,這會對你大有好處。
『伍』 求助:C語言如何輸出句柄
句柄就是一種資源的序號,一般是個無符號整數而已,比如文件句柄,就是系統提供一組可以打開文件的數據結構(實際上是結構數組),句柄就是數組下標。
所謂輸出句柄,你可以將句柄當作函數調用的返回值,或者列印出來看也不是不可以。
『陸』 C語言中如何獲得當前進程句柄,謝謝!
DWORD PID;
PID = GetProcessPID(L"test.exe");
//獲取進程pid函數
DWORD GetProcessPID(LPCTSTR pName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot) {
return NULL;
}
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk;
for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)){
if (!_tcsicmp(pe.szExeFile, pName)) {
CloseHandle(hSnapshot);
return pe.th32ProcessID;
}
}
return NULL;
}
//由進程pid獲取進程句柄,置頂
HWND hh = GetProcessTopWindows(PID);
HWND GetProcessTopWindows(DWORD dwPID){
count = 0;
EnumWindows((WNDENUMPROC)EnumWndProc, (LPARAM)dwPID);
if(count > 0) {
//cout << "窗口句柄是:" << nhWnd[count -1] << endl;//輸出句柄,可用spy++工具核對
return (nhWnd[count -1]);
}
return NULL;
}
別忘了添加對應頭文件。
『柒』 C語言找到窗口句柄,然後進行後台滑鼠鍵盤操作
窗口處理函數中加入WM_MOUSEMOVE消息,然後編寫滑鼠消息處理函數OnMouseMove,當然,滑鼠消息不止這一個,具體請查看msdn
鍵盤:添加WM_KEYDOWN/WM_KEYUP/WM_CHAR消息,這三個消息的具體請查看msdn,然後就可以編寫消息消息處理函數了!
『捌』 編程中句柄的意思是什麼
所謂句柄實際上是一個數據,是一個Long (整長型)的數據。
句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,點陣圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。
從上面的定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之後其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。
如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內存地址。應用程序啟動後,組成這個程序的各對象是住留在內存的。如果簡單地理解,似乎我們只要獲知這個內存的首地址,那麼就可以隨時用這個地址訪問對象。但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,Windows是一個以虛擬內存為基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪裡去找該對象呢?
為了解決這個問題,Windows操作系統為各應用程序騰出一些內存儲地址,用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。Windows內存管理器在移動對象在內存中的位置後,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。
句柄地址(穩定)→記載著對象在內存中的地址————→對象在內存中的地址(不穩定)→實際對象
本質:WINDOWS程序中並不是用物理地址來標識一個內存塊,文件,任務或動態裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,並將句柄返回給應用程序,然後通過句柄來進行操作。
但是必須注意的是程序每次從新啟動,系統不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成是一個應用程序的啟動運行,那麼系統給應用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個座位是一樣的道理。
『玖』 句柄是什麼它中C語言編程中有何作用
差不多如此了。在16位windows時期,句柄差不多也是對象在內存中分配的初始地址;但在win32,標識對象用一個32位的,唯一的整數.然後系統同這個對象打交道,主要就通過這個handle.
『拾』 c++中的句柄是什麼意思,如何理解
所謂句柄實際上是一個數據,是一個Long(整長型)的數據。
句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,點陣圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。
從上面的定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之後其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。
如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內存地址。應用程序啟動後,組成這個程序的各對象是住留在內存的。如果簡單地理解,似乎我們只要獲知這個內存的首地址,那麼就可以隨時用這個地址訪問對象。但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,Windows是一個以虛擬內存為基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪裡去找該對象呢?
為了解決這個問題,Windows操作系統為各應用程序騰出一些內存儲地址,用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。Windows內存管理器在移動對象在內存中的位置後,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。
句柄地址(穩定)→記載著對象在內存中的地址————→對象在內存中的地址(不穩定)→實際對象
本質:WINDOWS程序中並不是用物理地址來標識一個內存塊,文件,任務或動態裝入模塊的,相反的,WINDOWSAPI給這些項目分配確定的句柄,並將句柄返回給應用程序,然後通過句柄來進行操作。
但是必須注意的是程序每次從新啟動,系統不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成是一個應用程序的啟動運行,那麼系統給應用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個座位是一樣的道理。