0

以下代码在 Windows XP 中运行良好,并且曾一度在 Windows 7 中运行,但不再运行。我似乎无法弄清楚为什么不幸。其他人有问题吗?

更具体地说,它可以毫无问题地找到所有图标及其位置。它是专门返回 /0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0 的图标名... ……

WriteProcessMemory(vProcess, vPointer, Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0),Marshal.SizeOf(typeof(LVITEM)), ref vNumberOfBytesRead);
SendMessage(vHandle, LVM_GETITEMW, j, vPointer.ToInt32());
ReadProcessMemory(vProcess, (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(LVITEM))), Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0), vBuffer.Length, ref vNumberOfBytesRead);
string vText = Encoding.Unicode.GetString(vBuffer, 0, (int)vNumberOfBytesRead);
string IconName = Marshal.PtrToStringAnsi(vItem[0].pszText);

vText 和 IconName 都没有显示任何内容:(

至于pszText,这两种我都试过了:

vItem[0].pszText = (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(LVITEM)));
vItem[0].pszText = Marshal.AllocHGlobal(512);

仅供参考:

private const int LVM_FIRST = 0x1000;
private const uint LVM_GETITEMW = LVM_FIRST + 75;

完整代码:(忽略所有额外的 Console.WriteLines,我正在调试) http://pastebin.com/RXd2uwx3

4

1 回答 1

1

我遇到了同样的问题。

可能是您的代码在 x64 版本的 windows7 下运行。在默认的 C# 构建设置中,IntPtr 大小被视为 32 位 int 指针。但 ReadProcessMemory 是 64 位 int 指针。

您必须将 VS 的构建选项更改为 [AnyCPU] 为 [x64],您的代码将运行良好。

于 2012-07-15T04:08:21.193 回答