Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows ListView LVM_GETITEM iImage始终为零_C++_Windows_Shell - Fatal编程技术网

C++ Windows ListView LVM_GETITEM iImage始终为零

C++ Windows ListView LVM_GETITEM iImage始终为零,c++,windows,shell,C++,Windows,Shell,我正在尝试用桌面列表视图做一些事情。我可以使用LVM_GETITEM获取项的文本,但是iImage struct成员总是零,状态也是零。我正在运行win764,并使用devc++(gcc)为64进行编译。我还尝试将其编译为32位,并在XP上进行测试,结果相同……只将文本、图像和状态赋值为零。我还可以获取项目计数ListView_GetItemCount()没有问题 您正在为文本分配虚拟内存。您还必须为LVITEM分配虚拟内存。然后将文本内存分配给lvItem.pszText,然后读取这两个内存。

我正在尝试用桌面列表视图做一些事情。我可以使用LVM_GETITEM获取项的文本,但是iImage struct成员总是零,状态也是零。我正在运行win764,并使用devc++(gcc)为64进行编译。我还尝试将其编译为32位,并在XP上进行测试,结果相同……只将文本、图像和状态赋值为零。我还可以获取项目计数ListView_GetItemCount()没有问题


您正在为文本分配虚拟内存。您还必须为
LVITEM
分配虚拟内存。然后将文本内存分配给
lvItem.pszText
,然后读取这两个内存。对于64位系统,必须对其进行64位编译。添加更多错误检查

HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
     PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, dwProcessID);

const DWORD dwBufSize = 1024;
void* pbuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);
void* pitem = VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);

LVITEM lvItem = { 0 };
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.cchTextMax = MAX_PATH;
lvItem.pszText = (char*)pbuf;

WriteProcessMemory(hProcess, pitem, &lvItem, sizeof(LVITEM), NULL);

if (SendMessage(hwndListView, LVM_GETITEM, 0, (LPARAM)(LVITEM*)(pitem)))
{
    char buf[dwBufSize];
    if (ReadProcessMemory(hProcess, pbuf, buf, dwBufSize, 0))
    {
        OutputDebugString(buf);
        OutputDebugString(", ");
        if (ReadProcessMemory(hProcess, pitem, &lvItem, sizeof(LVITEM), 0))
        {
            _itoa_s(lvItem.iImage, buf, 10);
            OutputDebugString(buf);
            OutputDebugString("\n");
        }
    }
}

VirtualFreeEx(hProcess, pitem, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pbuf, 0, MEM_RELEASE);
CloseHandle(hProcess);

原来我不需要再这样做了,但是谢谢你的帮助!我会投票赞成你的答案,这可能是最好的。不建议使用此方法访问桌面。
HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
     PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, dwProcessID);

const DWORD dwBufSize = 1024;
void* pbuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);
void* pitem = VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);

LVITEM lvItem = { 0 };
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.cchTextMax = MAX_PATH;
lvItem.pszText = (char*)pbuf;

WriteProcessMemory(hProcess, pitem, &lvItem, sizeof(LVITEM), NULL);

if (SendMessage(hwndListView, LVM_GETITEM, 0, (LPARAM)(LVITEM*)(pitem)))
{
    char buf[dwBufSize];
    if (ReadProcessMemory(hProcess, pbuf, buf, dwBufSize, 0))
    {
        OutputDebugString(buf);
        OutputDebugString(", ");
        if (ReadProcessMemory(hProcess, pitem, &lvItem, sizeof(LVITEM), 0))
        {
            _itoa_s(lvItem.iImage, buf, 10);
            OutputDebugString(buf);
            OutputDebugString("\n");
        }
    }
}

VirtualFreeEx(hProcess, pitem, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pbuf, 0, MEM_RELEASE);
CloseHandle(hProcess);