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

私は同じ問題に遭遇しました。

Windows7 の x64 バージョンで実行されているコードである可能性があります。デフォルトの C# ビルド設定では、IntPtr のサイズは 32 ビットの int ポインターと見なされます。しかし、ReadProcessMemory は 64 ビットの int ポインターです。

VS のビルド オプションを [AnyCPU] から [x64] に変更する必要があります。コードは正常に動作します。

于 2012-07-15T04:08:21.193 に答える