我想學習C++,但不能完全理解爲什麼當我嘗試通過節點插件快照模塊時,通過VS運行程序時返回不同的結果在桌面上。節點插件無法快照(CreateToolhelp32Snapshot)模塊
使用this源從MSDN,我可以在一個進程中列出的所有模塊:
void fm(LPSTR name) {
HANDLE hModuleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 5844);
MODULEENTRY32 mEntry;
// check invalid handle value...
// check module32first...
mEntry.dwSize = sizeof(mEntry);
do {
if (!strcmp(mEntry.szModule, name)) {
CloseHandle(hModuleSnapshot);
cout << mEntry.szModule << endl;
}
} while (Module32Next(hModuleSnapshot, &mEntry));
}
這按預期工作,並會查找/打印模塊的信息(檢查省略錯誤) - 不過,當我嘗試和端口這個功能到Node附加組件上並沒有列出與上述代碼相同的模塊(代碼幾乎相同,我不知道爲什麼試圖在自定義Node附加組件中實現該功能會影響結果):
void fm() {
HANDLE hModuleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 5844);
MODULEENTRY32 mEntry;
// check invalid handle value...
// check module32first...
mEntry.dwSize = sizeof(mEntry);
do {
cout << mEntry.szModule << endl;
} while (Module32Next(hModuleSnapshot, &mEntry));
CloseHandle(hModuleSnapshot);
}
After使用node-gyp編譯附加組件,我可以成功調用它(在需要之後,它只是運行一個調用fm
的函數)。
如果我試圖快照與PID 5844
(VS碼)的過程中它打印出:
Code.exe ntdll.dll wow64.dll wow64win.dll wow64cpu.dll
如果我嘗試用PID 6540
器(Chrome)的過程中它打印出:
chrome.exe ntdll.dll wow64.dll wow64win.dll wow64cpu.dll
這顯然是不正確的,它打印出相同的模塊,即使PID(硬編碼)是不同的。
如果我使用的一個代碼塊,並用VS運行它,我得到:
chrome.exe ntdll.dll KERNEL32.DLL KERNELBASE.dll apphelp.dll ADVAPI32.dll msvcrt.dll sechost.dll RPCRT4.dll SspiCli.dll CRYPTBASE.dll...
還有很多更多的模塊,但你可以看到這是第二個代碼塊應該打印的內容。
我不知道爲什麼通過自定義節點插件運行代碼會影響結果,除非我遺漏或不瞭解某些關於節點附件的內容。
我可以使用CreateToolhelp32Snapshot
與Node附件正確打開並收集有關所有進程的信息,但似乎無法收集有關進程中模塊的信息。
爲什麼你用'do ... while'而不是'while'? –
沒有理由,爲什麼'while while'在'while while'上使用? – Rob
我還沒有完全明白。你可能在'// check ...'部分初始化'mEntry'。 –