2012-05-07 3 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을 반환하는 아이콘 이름입니다.

private const int LVM_FIRST = 0x1000; 
private const uint LVM_GETITEMW = LVM_FIRST + 75; 
: 그냥 참조

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

: ....

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에 대한 등을 보여 둘, 나는이 두 가지를 시도했다

전체 코드 : (모든 추가 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]로 변경하면 코드가 잘 작동합니다.