1

我正在调用该函数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;
4

4 回答 4

5

很可能您正在尝试从 64 位应用程序打开 32 位进程,反之亦然。您只能使用相同类型的进程。

于 2011-08-05T20:52:03.973 回答
2

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

第三个参数应该是您在第二个参数中传递的 HMODULES数组的大小。你只通过1,不够大。注意 lpcbNeeded,它告诉你数组需要多大才能不出错。

于 2011-08-05T20:53:27.573 回答
1

如果目标平台是 x86,那么你可以尝试将其更改为 x64。

您可以阅读文档:https ://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-enumprocessmodules

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

于 2020-05-28T10:18:42.223 回答
0

那么,GetLastError返回什么?编辑:我的错,我失败了..

进行错误检查并确保它不是SendMessage, EnableTokenPrivilege,或者OpenProcess这会给您带来错误。

于 2011-08-05T20:43:04.400 回答