2012-05-07 36 views
0

次のコードはWindows XPで正常に動作し、Windows 7でも一度動作していましたが、動作しなくなりました。私は残念なことに理由を理解できないようです。他の誰かに問題があったのですか?ListView(LVM_GETITEM)でデスクトップアイコンを読む - 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; 

フルコード:(すべての余分なC onsole.WriteLines、私はデバッグしていた) http://pastebin.com/RXd2uwx3

+0

あなたが観察したように、ドキュメント化されていないメカニズムを使用するのではなく、さまざまなバージョンのWindowsで機能しない傾向があるので、[文書化されたテクニック](http://blogs.msdn.com/b/oldnewthing/archive /2004/07/20/188696.aspx)? –

答えて

1

私は同じ問題が発生しました。

x64版のwindows7で動作しているコードがあります。 デフォルトのC#ビルド設定では、IntPtrのサイズは32ビットのintポインタとみなされます。 しかし、ReadProcessMemoryは64ビットのintポインタです。

VSのビルドオプションを[AnyCPU]から[x64]に変更する必要があります。 コードがうまく機能します。

関連する問題