【问题标题】:Process32Next fails with ERROR_INSUFFICIENT_BUFFER (windows 7)Process32Next 因 ERROR_INSUFFICIENT_BUFFER 失败(Windows 7)
【发布时间】:2012-06-04 03:19:49
【问题描述】:

我正在尝试获取正在运行的进程的所有可执行路径的列表

do-while 循环(如下所示)开始并在大约 90 次迭代后失败并出现 ERROR_INSUFFICIENT_BUFFER 错误。我想那是 pBuffer,我尝试了一个非常大的缓冲区,但它仍然失败。失败迭代的 ProcessEntry 结构在 szExeFile 中有垃圾。请指教(我关闭了把手,下面没有显示)

代码:

// Retrieve a handle to the process snapshot
HANDLE hProcessSnapshot(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));
if (INVALID_HANDLE_VALUE == hProcessSnapshot) ERROR;

// Retrieve information about the first process and exit if unsuccessful
PROCESSENTRY32 oProcessEntry;
memset(&oProcessEntry, 0x00, sizeof(oProcessEntry));
oProcessEntry.dwSize = sizeof(PROCESSENTRY32);
BOOL bFileFound(Process32First(hProcessSnapshot, &oProcessEntry));
DWORD dwError;
if(!bFileFound) {        
    dwError = GetLastError();
    if(ERROR_NO_MORE_FILES == dwError) return TPathList();

    // Error
    ERROR; 
}

// Walk the snapshot of processes
TCHAR pBuffer[MAX_PATH];
TPathList lExecutablePaths;
do {
    // Get handle to process
    HANDLE hProcess(OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 
                                FALSE, 
                                oProcessEntry.th32ProcessID));
    if(INVALID_HANDLE_VALUE == hProcess) ERROR;
    if (!hProcess) continue;

    // Get the module path
    if(GetModuleFileNameEx(hProcess, 0, pBuffer, MAX_PATH) == 0) ERROR;      
    lExecutablePaths.push_back(CPath(pBuffer));        
} 
// Get next process 
while(Process32Next(hProcessSnapshot, &oProcessEntry));

// If we ran out of files return what has been found
dwError = GetLastError();
if(ERROR_NO_MORE_FILES == dwError) return lExecutablePaths;
ERROR;

【问题讨论】:

    标签: winapi visual-c++ process


    【解决方案1】:

    你可以这样使用:

    CString sBuffer;
    DWORD dwSize = MAX_PATH + 1, dwError = 0;
    
    do
    {
        GetModuleFileName( NULL, sBuffer.GetBuffer( dwSize ), dwSize );
    
        // Retrieve the last error. If we've succeeded ERROR_SUCCESS
        // will be returned; otherwise, we'll get an ERROR_INSUFFICIENT_BUFFER
        // error.
        dwError = ::GetLastError( );
    
        // Buffer may not be big enough so double its size
        dwSize *= 2;
    }
    while( dwError == ERROR_INSUFFICIENT_BUFFER
        && dwError != ERROR_SUCCESS );
    
    // Release the buffer (turn the string back to const)
    sBuffer.ReleaseBuffer( );
    

    我希望它会起作用。

    你也可以选择How can I calculate the complete buffer size for GetModuleFileName?

    【讨论】:

    • 谢谢,但我遇到的问题不是 GetModuleFileNameEx 而是 Process32Next 函数。那是失败的 ERROR_INSUFFICIENT_BUFFER
    猜你喜欢
    • 2021-04-24
    • 2020-11-07
    • 2010-12-26
    • 2014-07-09
    • 2012-01-16
    • 2011-11-30
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多