gpt4 book ai didi

c++ - GetModuleFileNameEx,拒绝访问错误

转载 作者:行者123 更新时间:2023-11-27 23:00:11 25 4
gpt4 key购买 nike

我正在尝试获取所有打开进程的名称。这是我的:

   #include "stdafx.h"
#include <Psapi.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int iCmdShow)
{
bool _result;
DWORD *pProcessIds = new DWORD[1000];
DWORD cb;
DWORD pBytesReturned;

_result = EnumProcesses(pProcessIds, 1000, &pBytesReturned);

HANDLE hndProccesse;


for (int i = 0; i < pBytesReturned / sizeof(DWORD); ++i)
{
hndProccesse = OpenProcess(STANDARD_RIGHTS_ALL, false, *pProcessIds);
DWORD _len;

DWORD _len2 =0;
LPWSTR lpFilename = new WCHAR[100];
_len =GetModuleFileNameEx(hndProccesse,NULL, lpFilename, _len2);
DWORD _errr;
_errr = GetLastError();
MessageBox(NULL, lpFilename, NULL, 0);
CloseHandle(hndProccesse);

pProcessIds ++;



}

return 0;
}

直到 GetModuleFileNameEx 出现访问被拒绝错误 (5) 为止一切正常。

此外,这是消息框上显示的内容: enter image description here

有什么想法吗?

最佳答案

GetModuleFileNameEx() 的第四个参数必须是第三个参数中传递的数组的大小。您传入 _len2。但是您将 _len2 设置为零,而不是您的 lpFilename 数组的大小 (100)。所以 GetModuleFileNameEx() 认为它无事可做,甚至不会触及您的 lpFilename 数组。堆数据不一定初始化为零,因此 lpFilename 仍然包含随机垃圾,因此包含随机消息框内容。

我猜 GetModuleFileNameEx() 返回零是因为它不需要写任何东西,但没有设置最后一个错误代码,因为没有失败,所以访问被拒绝错误是从程序的早期部分遗留下来的。

一些注意事项:

请记住 Jonathan Potter 所说的检查从 Windows API 函数返回的错误的正确方法。您在 _len 中从 GetModuleFileNameEx() 返回了值。 MSDN 说 GetModuleFileNameEx() 出错时返回零。所以在得到最后一个错误值之前需要先检查_len是否为0,否则没有意义。如前所述,GetModuleFileNameEx() 如果成功,则不必清除最后一个错误值。

HANDLE hndProccesse = new HANDLE; 绝对是错误的,但这不是您程序中的错误(不过,它内存泄漏!)。 HANDLE 本身是一个指针,这就是允许 new 运行的原因。但这样做是没有意义的,因为 HANDLE 是由操作系统返回的,通常不应该用作指针。将它们视为不透明值。

关于内存泄漏的主题,您永远不会delete[] 您在循环中创建的每个lpFilename,也不会delete[] pProcessIds。这对于您在上面发布的小程序来说可能并不重要,但如果您的程序不断增长,您肯定会想要修复它。

通常,使用 MAX_PATH 作为文件名缓冲区的标称长度而不是 100。这是各种 shell 函数使用的。 (更长的时间也不会造成伤害,但更短的时间会。)

关于c++ - GetModuleFileNameEx,拒绝访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28513561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com