2015-12-02 34 views
1

我想學習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附件正確打開並收集有關所有進程的信息,但似乎無法收集有關進程中模塊的信息。

+0

爲什麼你用'do ... while'而不是'while'? –

+0

沒有理由,爲什麼'while while'在'while while'上使用? – Rob

+0

我還沒有完全明白。你可能在'// check ...'部分初始化'mEntry'。 –

回答

0

在x64進程(Node.exe)中使用TH32CS_SNAPMODULE在x86進程將只給你64位模塊,使用TH32CS_SNAPMODULE32獲得32位模塊 - TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32所有模塊。