文件句柄名稱怎么獲得(通過文件句柄獲取文件信息)
1. 通過文件句柄獲取文件信息
Win32進(jìn)程間通信的方式主要有:
(1)剪貼板(Clip Board);
(2)動(dòng)態(tài)數(shù)據(jù)交換(Dynamic Data Exchange);
(3)部件對(duì)象模型(Component Object Model);
(4)文件映射(File Mapping);
(5)郵件槽(Mail Slots);
(6)管道(Pipes);
(7)Win32套接字(Socket);
(8)遠(yuǎn)程過程調(diào)用(Remote Procedure Call);
(9)WM_COPYDATA消息(WM_COPYDATA Message)。 在WIN32中,可使用在PSAPI .DLL中提供的Process status Helper函數(shù)幫助我們獲取進(jìn)程信息。
(1)EnumProcesses()函數(shù)可以獲取進(jìn)程的ID,其原型為:
BOOL EnumProcesses(DWORD * lpidProcess, DWORD cb, DWORD*cbNeeded);
參數(shù)lpidProcess:一個(gè)足夠大的DWORD類型的數(shù)組,用于存放進(jìn)程的ID值;參數(shù)cb:存放進(jìn)程ID值的數(shù)組的最大長(zhǎng)度,是一個(gè)DWORD類型的數(shù)據(jù);
參數(shù)cbNeeded:指向一個(gè)DWORD類型數(shù)據(jù)的指針,用于返回進(jìn)程的數(shù)目;
函數(shù)返回值:如果調(diào)用成功,返回TRUE,同時(shí)將所有進(jìn)程的ID值存放在lpidProcess參數(shù)所指向的數(shù)組中,進(jìn)程個(gè)數(shù)存放在cbNeeded參數(shù)所指向的變量中;如果調(diào)用失敗,返回FALSE。
(2)GetModuleFileNameExA()函數(shù)可以實(shí)現(xiàn)通過進(jìn)程句柄獲取進(jìn)程文件名,其原型為:
DWORD GetModuleFileNameExA(HANDLE hProcess, HMODULE hModule,LPTSTR lpstrFileName, DWORD nsize);
參數(shù)hProcess:接受進(jìn)程句柄的參數(shù),是HANDLE類型的變量;
參數(shù)hModule:指針型參數(shù),在本文的程序中取值為NULL;
參數(shù)lpstrFileName:LPTSTR類型的指針,用于接受主調(diào)函數(shù)傳遞來的用于存放進(jìn)程名的字符數(shù)組指針;
參數(shù)nsize:lpstrFileName所指數(shù)組的長(zhǎng)度;
函數(shù)返回值:如果調(diào)用成功,返回一個(gè)大于0的DWORD類型的數(shù)據(jù),同時(shí)將hProcess所對(duì)應(yīng)的進(jìn)程名存放在lpstrFileName參數(shù)所指向的數(shù)組中;如果調(diào)用失敗,則返回0。
通過下列代碼就可以遍歷系統(tǒng)中的進(jìn)程,獲得進(jìn)程列表:
//獲取當(dāng)前進(jìn)程總數(shù)
EnumProcesses(process_ids, sizeof(process_ids), &num_processes);
//遍歷進(jìn)程
for (int i = 0; i < num_processes; i++)
{
//根據(jù)進(jìn)程ID獲取句柄
process[i] = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0,
process_ids[i]);
//通過句柄獲取進(jìn)程文件名
if (GetModuleFileNameExA(process[i], NULL, File_name, sizeof(fileName)))
cout << fileName << endl;
}
2. 通過句柄獲取窗口內(nèi)容
句柄這一概念是MFC里的一個(gè)類,MFC有專門的函數(shù)來獲取窗口句柄。HWNDhwnd;hwnd=CreateWindow("myownwindowshandle","jaycnvip",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL)
;這是用一個(gè)句柄變量來保存新創(chuàng)建的窗口句柄。
其它如:通過窗口標(biāo)題獲取窗口句柄CWnd*pWnd=FindWindow(_T("#32770"),_T("QQ用戶登錄"))
;CWnd有個(gè)成員函數(shù)HWNDGetSafeHwnd()const;在對(duì)話框類的成員函數(shù)里用HWNDhwnd=GetSafeHwnd();得到的hwnd就是句柄了
3. 文件句柄是文件的識(shí)別依據(jù)
是不是取某個(gè)程序的窗口句柄?我以前寫輔助的時(shí)候弄過使用的API函數(shù)是findWindow首先聲明一下API在你窗口最頂?shù)奈恢蒙蠈懮螾rivate Declare Function 取窗口句柄 Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long'由于VB支持中文的 我就定義成 取窗口句柄 這個(gè)了 '在窗體中添加一個(gè)按鈕里面放進(jìn)下面代碼就OK了Private Sub Command1_Click()Dim 窗口句柄 As Long '聲明窗口句柄變量存儲(chǔ)窗口句柄 = 取窗口句柄(vbNullString, "新建 文本文檔.txt - 記事本") '取窗口標(biāo)題的句柄 把得到窗口標(biāo)題句柄賦予給剛才 窗口句柄 這變量里If 窗口句柄 = 0 Then '判斷窗口句柄是否等于0 如果等于0表示無法找到窗口句柄 MsgBox "無法找到需要的窗口句柄"Else MsgBox "已找到窗口句柄 句柄數(shù)為:" & 窗口句柄End IfEnd Sub純手工+VB寫出來的代碼 完全不是自己找的
4. 通過文件句柄獲取文件信息的方法有
Linux文件數(shù)打開數(shù) 查看當(dāng)前系統(tǒng)最大的文件打開數(shù), 在linux終端中輸入ulimit -a “open files”參數(shù)選項(xiàng)后面的數(shù)值就是當(dāng)前系統(tǒng)支持的最大打開文件數(shù) 修改linux最大文件打開數(shù) 如果要修改linux最大文件打開數(shù),可以通過參數(shù)命令 unlimit -n 后面接需要設(shè)置的文件數(shù)量。
設(shè)置好之后,再次查看 unlimit -a 你會(huì)發(fā)現(xiàn)已經(jīng)設(shè)置為新的數(shù)量了 設(shè)置好之后,再次編輯修改重啟設(shè)置的服務(wù),已經(jīng)沒有剛剛那個(gè)1024文件數(shù)限制的報(bào)錯(cuò)提示 其他修改方法 除此之外,如果針對(duì)不同的用戶。
也可以通過編輯修改 /etc/rc.local文件設(shè)置環(huán)境變量,添加 unlimit -n ,重啟之后一般就自動(dòng)設(shè)置好了 查看系統(tǒng)句柄文件數(shù) 當(dāng)前系統(tǒng)文件句柄的最大數(shù)目,只用于查看,不能設(shè)置修改 cat /proc/sys/fs/file-max 查看進(jìn)程打開文件數(shù) 如果需要查看所有進(jìn)程的文件打開數(shù),命令lsof |wc -l
5. 文件句柄怎么看
句柄無效處理方法:此警告音是否由于安裝了第三方軟件后提示的,如果是建議卸載掉不要使用,或查看是不是游戲本身遇到了問題,可以卸載重新下載安裝。
系統(tǒng)不能加載用戶配置, 但能加載默認(rèn)配置。
6. 查看文件句柄的命令
1.首先打開python的編輯器pycharm。
2.然后再文件中使用open 函數(shù)來打開文件,格式:open(文件地址,文件類型)。例如:f=open("1.txt",'r')表示打開1.txt這個(gè)文件,打開方式是只讀的打開方式。
3.然后通過read函數(shù)將文件中的內(nèi)容讀取出來。b=f.read()。
4.讀取完畢之后,我們要記得將打開文件的句柄關(guān)掉,使用close關(guān)掉即可。f.close()。
5.接著我們將文件內(nèi)容打印出來。print(b)。
6.點(diǎn)擊頂部的菜單欄run這個(gè)運(yùn)行命令。
7.在下方的控制臺(tái)我們就可以看到從文件中讀取的內(nèi)容了!
7. 如何獲取文件句柄
現(xiàn)理解的句柄有以下兩種意義:
第一種是指程序設(shè)計(jì);
第二種是指Windows編程。現(xiàn)在大部分都是指程序設(shè)計(jì)、程序開發(fā)這類。
句柄解釋也有以下兩種:
第一種解釋:句柄是一種特殊的智能指針 。當(dāng)一個(gè)應(yīng)用程序要引用其他系統(tǒng)(如數(shù)據(jù)庫(kù)、操作系統(tǒng))所管理的內(nèi)存塊或?qū)ο髸r(shí),就要使用句柄。
第二種解釋:句柄是整個(gè)Windows編程的基礎(chǔ)。一個(gè)句柄是指使用的一個(gè)唯一的整數(shù)值,即一個(gè)4字節(jié)(64位程序中為8字節(jié))長(zhǎng)的數(shù)值,來標(biāo)識(shí)應(yīng)用程序中的不同對(duì)象和同類中的不同的實(shí)例。
例如,一個(gè)窗口,按鈕,圖標(biāo),滾動(dòng)條,輸出設(shè)備,控件或者文件等。應(yīng)用程序能夠通過句柄訪問相應(yīng)的對(duì)象的信息,但這里的句柄不是指針,程序不能利用句柄來直接閱讀文件中的信息。如果句柄不在I/O文件中,它是毫無用處的。 句柄是Windows用來標(biāo)志應(yīng)用程序中建立的或是使用的唯一整數(shù),Windows大量使用了句柄來標(biāo)識(shí)對(duì)象。
8. 文件句柄獲取文件名
這是操作系統(tǒng)里的一個(gè)概念,句柄是WONDOWS用來標(biāo)識(shí)被應(yīng)用程序所建立或使用的對(duì)象的唯一整數(shù),WINDOWS使用各種各樣的句柄標(biāo)識(shí)諸如應(yīng)用程序?qū)嵗?,窗口,控制,位圖,GDI對(duì)象等等。
WINDOWS句柄有點(diǎn)象C語言中的文件句柄。 從上面的定義中的我們可以看到,句柄是一個(gè)標(biāo)識(shí)符,是拿來標(biāo)識(shí)對(duì)象或者項(xiàng)目的,它就象我們的姓名一樣,每個(gè)人都會(huì)有一個(gè),不同的人的姓名不一樣,但是,也可能有一個(gè)名字和你一樣的人。
從數(shù)據(jù)類型上來看它只是一個(gè)16位的無符號(hào)整數(shù)。
應(yīng)用程序幾乎總是通過調(diào)用一個(gè)WINDOWS函數(shù)來獲得一個(gè)句柄,之后其他的WINDOWS函數(shù)就可以使用該句柄,以引用相應(yīng)的對(duì)象。
如果想更透徹一點(diǎn)地認(rèn)識(shí)句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內(nèi)存地址。應(yīng)用程序啟動(dòng)后,組成這個(gè)程序的各對(duì)象是住留在內(nèi)存的。
如果簡(jiǎn)單地理解,似乎我們只要獲知這個(gè)內(nèi)存的首地址,那么就可以隨時(shí)用這個(gè)地址訪問對(duì)象。但是,如果您真的這樣認(rèn)為,那么您就大錯(cuò)特錯(cuò)了。我們知道,Windows是一個(gè)以虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng)。在這種系統(tǒng)環(huán)境下,Windows內(nèi)存管理器經(jīng)常在內(nèi)存中來回移動(dòng)對(duì)象,依此來滿足各種應(yīng)用程序的內(nèi)存需要。
對(duì)象被移動(dòng)意味著它的地址變化了。如果地址總是如此變化,我們?cè)摰侥睦锶フ以搶?duì)象呢? 為了解決這個(gè)問題,Windows操作系統(tǒng)為各應(yīng)用程序騰出一些內(nèi)存儲(chǔ)地址,用來專門登記各應(yīng)用對(duì)象在內(nèi)存中的地址變化,而這個(gè)地址(存儲(chǔ)單元的位置)本身是不變的。
Windows內(nèi)存管理器在移動(dòng)對(duì)象在內(nèi)存中的位置后,把對(duì)象新的地址告知這個(gè)句柄地址來保存。
這樣我們只需記住這個(gè)句柄地址就可以間接地知道對(duì)象具體在內(nèi)存中的哪個(gè)位置。
這個(gè)地址是在對(duì)象裝載(Load)時(shí)由系統(tǒng)分配給的,當(dāng)系統(tǒng)卸載時(shí)(Unload)又釋放給系統(tǒng)。
句柄地址(穩(wěn)定)→記載著對(duì)象在內(nèi)存中的地址----→對(duì)象在內(nèi)存中的地址(不穩(wěn)定)→實(shí)際對(duì)象 本質(zhì):WINDOWS程序中并不是用物理地址來標(biāo)識(shí)一個(gè)內(nèi)存塊,文件,任務(wù)或動(dòng)態(tài)裝入模塊的,相反的,WINDOWS API給這些項(xiàng)目分配確定的句柄,并將句柄返回給應(yīng)用程序,然后通過句柄來進(jìn)行操作。
但是必須注意的是程序每次從新啟動(dòng),系統(tǒng)不能保證分配給這個(gè)程序的句柄還是原來的那個(gè)句柄,而且絕大多數(shù)情況的確不一樣的。
假如我們把進(jìn)入電影院看電影看成是一個(gè)應(yīng)用程序的啟動(dòng)運(yùn)行,那么系統(tǒng)給應(yīng)用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個(gè)座位是一樣的道理。
強(qiáng)推





