請教有關 VirtualQueryEx() 的用法 |
尚未結案
|
jazchen
一般會員 發表:1 回覆:2 積分:0 註冊:2004-02-18 發送簡訊給我 |
http://delphi.ktop.com.tw/topic.php?topic_id=25705 我再上面的文章看到取得記憶體的方式!
因為我希望在 Win98 下也可以使用
所以我採用 VirtualQueryEx 來取得~ 以下是我的程式碼
HANDLE toolhelp; PROCESSENTRY32 pe; memset(&pe, 0x00, sizeof(PROCESSENTRY32)); pe.dwSize = sizeof(PROCESSENTRY32); toolhelp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); MEMORY_BASIC_INFORMATION * mbi; if (Process32First(toolhelp,&pe)) { do { memset(&mbi, 0x00, sizeof(mbi)); HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID); VirtualQueryEx(hProcess, 0, mbi, sizeof(mbi)); addListItem(pe.th32ProcessID, pe.szExeFile, AnsiString(mbi->RegionSize)); } while (Process32Next(toolhelp,&pe)); } CloseHandle(toolhelp); ----------------------- void addListItem(DWORD pid, AnsiString exename, AnsiString size) { TListItem *ListItem; ListItem = Form1->ListView1->Items->Add(); ListItem->Caption = pid; ListItem->SubItems->Add(exename); ListItem->SubItems->Add(size); }但是跑起來有錯誤~ 我看了VirtualQueryEx 和 MEMORY_BASIC_INFORMATION 的相關 MSDN 文件 但是我搞不懂問題在哪~ 初學 BCB 6 半天的菜鳥求救!! |
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: etc…etc…jazchen 你好: 我不知道你實際的需求,以及你撰寫的程式碼是否走向正確! 我只是單純從你提供的 >): < class="code"> void __fastcall TForm1::FormCreate(TObject *Sender) { HANDLE toolhelp; PROCESSENTRY32 pe; //ZeroMemory(&pe,sizeof(PROCESSENTRY32)); <---如果要設定初始值的話 pe.dwSize = sizeof(PROCESSENTRY32); toolhelp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); MEMORY_BASIC_INFORMATION mbi; if (Process32First(toolhelp,&pe)) { do { //ZeroMemory(&mbi,sizeof(mbi));<---如果要設定初始值的話 //以下的值要不要先assign,要assign多少,我都不知道 //NULL和0不一定相同 mbi.BaseAddress=0; mbi.AllocationBase=0; //mbi.RegionSize=0; mbi.AllocationProtect=PAGE_READWRITE; mbi.State=MEM_FREE; //ect... //.........................................// HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID); VirtualQueryEx(hProcess, NULL, &mbi, sizeof(mbi)); addListItem(pe.th32ProcessID, pe.szExeFile,AnsiString(mbi.RegionSize)); } while (Process32Next(toolhelp,&pe)); } CloseHandle(toolhelp); } 嗯,這樣應該是最起碼可以run的過了,只是光看listview的最後一列值都幾乎一樣,應該是有問題(當然每台pc run的值不同): 也就是我覺上述我提到的mbi變數的屬性都不用assign嗎?我的經驗,這種送一個data structure去得到值的情況下,有很多是要先assign一些初始值的,for example: 要去得到一個listview的其中一個item的內容值,則 1. 先宣告一個 LV_COLUMN 變數 lvclmn; 2. 設lvclmn.mask=LVIF_TEXT(告訴這個item我將要取它的text值) ect… 3. 告知listview要取它item的值,並將lvclmn送出 4. 成功的話,return回lvclmn這個變數,並將item值夾在lvclmn.pszText中 嗯,這幾隻api function我也沒用過,所以你再深入去追一下吧! |
jazchen
一般會員 發表:1 回覆:2 積分:0 註冊:2004-02-18 發送簡訊給我 |
COOL~~ 剛剛我好我弄出一個結果跟您的有的像的!
HANDLE toolhelp; PROCESSENTRY32 pe; memset(&pe, 0x00, sizeof(PROCESSENTRY32)); pe.dwSize = sizeof(PROCESSENTRY32); toolhelp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); LPCVOID lpAddress; MEMORY_BASIC_INFORMATION mbi; if (Process32First(toolhelp,&pe)) { do { memset(&mbi, 0x00, sizeof(mbi)); memset(&lpAddress, 0x00, sizeof(LPCVOID)); HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID); VirtualQueryEx(hProcess, lpAddress, &mbi, sizeof(mbi)); addListItem(pe.th32ProcessID, pe.szExeFile, AnsiString(mbi.RegionSize) ); } while (Process32Next(toolhelp,&pe)); } CloseHandle(toolhelp);出來的結果跟您的大致相同!! mbi.RegionSize 絕大部分都是 65536 我是想要寫一個類似 WINXP 的工作管理員的功能 可以列出系統中執行的 Process 和其記憶體用量 我有用 psapi 的 library 寫出來~ 但是在 win 98 中並不能使用~ 這點我再 msdn 已經知道嚕! 所以我想利用其他 98 support 的 api 來寫類似的功能 只是目前我還不知道我的方向有沒有錯誤! ^^" |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |