線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1951
推到 Plurk!
推到 Facebook!

請教有關 VirtualQueryEx() 的用法

尚未結案
jazchen
一般會員


發表:1
回覆:2
積分:0
註冊:2004-02-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-20 18:03:05 IP:202.145.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-23 12:58:39 IP:61.63.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-23 13:18:45 IP:202.145.xxx.xxx 未訂閱
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 來寫類似的功能 只是目前我還不知道我的方向有沒有錯誤! ^^"
系統時間:2024-05-02 8:27:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!