我浏览了类似的问题,但没有找到解决问题的方法。
异常类:
class Exception{
public:
Exception(LPCWSTR text){
QMessageBox::information(0, "Catch",
QString::fromWCharArray(text) + ", Code: " +
QString::number(GetLastError()));
//EnumModules is return FALSE in function getHinstance, Code: 299
}
}
主要代码:
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, 7068); //PID of opened calculator
if(handle == INVALID_HANDLE_VALUE)
throw Exception(L"invalid handle in function getHinstance");
int hNeeded = 1024;
HINSTANCE hModules[hNeeded];
DWORD bNeeded = 0;
PWSTR fileName = new WCHAR[512];
if(!EnumProcessModulesEx(handle, hModules, sizeof(hModules), &bNeeded, LIST_MODULES_ALL))
throw Exception(L"EnumModules is return FALSE in function getHinstance");
for(int i = 0; i < bNeeded / sizeof(HINSTANCE); ++i){
GetModuleBaseNameW(handle, hModules[i], fileName, sizeof(WCHAR) * 512);
if(lstrcmpW(fileName, moduleName) == 0){
delete [] fileName;
return hModules[i];
}
}
handle是处理过程的有效值
此代码在64位进程中执行以枚举64位进程中的模块
答案 0 :(得分:0)
当将以下代码作为64位进程运行时,我可以重现ERROR_PARTIAL_COPY(299)错误。
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 17152); //PID of opened notepad.exe
DWORD errCode = GetLastError();
HMODULE hModules[100];
DWORD bNeeded = 0;
EnumProcessModulesEx(handle, hModules, sizeof(hModules), &bNeeded, LIST_MODULES_ALL);
errCode = GetLastError();
并使用 LIST_MODULES_64BIT 代替LIST_MODULES_ALL来解决错误。
我的notepad.exe是64位进程。
因此,当使用EnumProcessModulesEx时,似乎需要使用LIST_MODULES_64BIT来枚举64位进程的模块。
或者您可以使用EnumProcessModules:
EnumProcessModules(handle, hModules, sizeof(hModules), &bNeeded);
答案 1 :(得分:-1)
我解决了我的问题: CreateProcess是返回的,无需等待创建过程
我的错是我没有让社区了解程序的真实上下文,而是只提供了与问题无关的一小段代码。谢谢大家的评论,我将尝试提出更详细的问题