EnumProcessModulesEx失败,返回错误代码299(ERROR_PARTIAL)

问题描述 投票:1回答:4

我调用的函数是 EnumProcessModulesEx 并且失败。我运行在64位机器上。下面是代码。

wchar_t* dest = new wchar_t[100];
int index = SendMessage(processes, LB_GETCURSEL, 0, 0);
SendMessage(processes, LB_GETTEXT, index, (LPARAM)dest);
HMODULE module;
unsigned long cbneeded;
EnableTokenPrivilege(hWnd, SE_DEBUG_NAME);
HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, _wtoi(dest));
int errorcode = GetLastError();
BOOL ret = EnumProcessModulesEx(h, &module, sizeof module, &cbneeded, LIST_MODULES_ALL);
int err = GetLastError();
wchar_t* name = new wchar_t[MAX_PATH];
GetModuleBaseName(h, module, name, sizeof name);
MessageBox(hWnd, name, L"Process Name", 0);
delete dest;
delete name;
c++ winapi windows-7 64-bit getlasterror
4个回答
2
投票

BOOL ret = EnumProcessModulesEx(h, &module, sizeof module, &cbneeded, LIST_MODULES_ALL)。

第3个参数应该是模块的大小。阵列 的HMODULES,你在第2次论证中通过了。 你只传了1,不够大。 注意lpcbNeeded,它告诉你需要多大的数组才不会出现错误。


3
投票

很有可能你是想从64位程序中打开32位进程,或者反之。你只能使用相同的进程。


0
投票

那么,什么是 GetLastError 返回?EDIT:我的错,我硬是失败了。

做错误检查,确保不是...。SendMessage, EnableTokenPrivilegeOpenProcess 这就是给你的错误。


0
投票

如果目标平台是x86,那么你可以尝试改成x64。

你可以阅读该文档。https:/docs.microsoft.comen-uswindowswin32apipsapinf-psapi-enumprocessmodules。

如果从运行在WOW64上的32位应用程序中调用这个函数,它只能枚举32位进程的模块。如果进程是64位进程,则该函数失败,最后的错误代码是ERROR_PARTIAL (299)。

© www.soinside.com 2019 - 2024. All rights reserved.