このコード行は私を困惑させています!
string s = Marshal.PtrToStringAnsi((IntPtr)((Int32)Buffer +
Marshal.SizeOf(typeof(Struct))));
これが関数の残りの部分です。
Api.LvItem lvItem = new Api.LvItem();
IntPtr lpLocalBuffer = Marshal.AllocHGlobal(1024);
uint pid;
uint thread = Api.GetWindowThreadProcessId(hWnd, out pid);
IntPtr hProcess = Api.OpenProcess(0x001f0fff, false, (int)pid);
IntPtr lpRemoteBuffer = Api.VirtualAllocEx(hProcess, IntPtr.Zero, 1024, 0x1000, 4);
lvItem.mask = 1;
lvItem.iItem = index;
lvItem.iSubItem = subitem;
lvItem.pszText = (IntPtr)((int)lpRemoteBuffer + Marshal.SizeOf(typeof(Api.LvItem)));
lvItem.cchTextMax = 50;
Api.WriteProcessMemory(hProcess, lpRemoteBuffer, ref lvItem, Marshal.SizeOf(typeof(Api.LvItem)), 0);
Api.SendMessage(hWnd, 0x1005, IntPtr.Zero, lpRemoteBuffer);
Api.ReadProcessMemory(hProcess, lpRemoteBuffer, lpLocalBuffer, 1024, 0);
string ret = Marshal.PtrToStringAnsi((IntPtr)((int)lpLocalBuffer + Marshal.SizeOf(typeof(Api.LvItem))));
Marshal.FreeHGlobal((IntPtr)lpLocalBuffer);
Api.VirtualFreeEx(hProcess, lpRemoteBuffer, 0, 0x8000);
Api.CloseHandle(hProcess);
return ret;
このコードは、別のプロセスのリストビュー内の各項目のテキストを取得するために使用されます。ここからコード(セミ)をたどりました:http://taylorza.blogspot.com/2009/08/archive-hacking-my-way-across-process.html
0x1005の使用について申し訳ありません。それがメッセージのコードですLV_GETITEM
。
プラットフォームに関連するものに絞り込みました。x64 と AnyCPU では動作しますが、x86 では動作しません。メモリ割り当てなどのサイズの違いを変更するにはどうすればよいですか
コンソール アプリケーションで使用すると、値が正しく返されます。しかし、リフレクションを介して呼び出される .DLL でこのコード (および残りのコード) を使用すると、コードは正しくない文字列を返します。空に見えますが、実際には null ではありません。おそらくただの空白...
この問題のマーシャリングで同様の経験をした人はいますか? もう3時間も頭を悩ませています...
どんな助けでも、どんなアイデアでも、何でも大歓迎です!