外部アプリケーション ( America Online ) に Owner Drawn List Box があり、ユーザビリティを支援するコンポーネントを構築するためにデータを取得する必要があります。(ユーティリティは、特定のものへのアクセスをより簡単にするなど)。
知らせ
C++ に関する私の知識は非常に貧弱です。私は C# プログラマーです。
問題のリスト ボックスにhWnd
がありますが、所有者が描いたようです。リターンの悪いデータを使用LB_GETTEXT
すると、ジャンク (デバッガーで漢字の束としてレンダリングされます)LB_GETITEMDATA
が得られ、リターンを通過するのとほぼ同じです。
これは、所有者が描画したリスト ボックスにグラフィックがあるためだと思います。多くの掘り下げを行って、過去にこの問題を抱えている他の人を発見しました。この問題を解決するはずの次のコードを発見しました。しかし、そうではありません。コードは以下に掲載されており、その下に問題があります。
void GetListItemData( HWND hListWnd, long index, char *outputResult )
{
int result;
DWORD processID;
HANDLE hProcess;
char *itemData;
char sDataRead[5];
DWORD bytes;
DWORD lListItemHold, lListItemDataHold;
*outputResult=0;
if( hListWnd )
{
GetWindowThreadProcessId( hListWnd, &processID );
hProcess=OpenProcess( 0x10|0xf0000|PROCESS_VM_READ, 0, processID );
if( hProcess )
{
lListItemHold=(DWORD)SendMessage( hListWnd, LB_GETITEMDATA, index-1, 0 );
lListItemHold=lListItemHold+24;
result=ReadProcessMemory( hProcess, (void *)lListItemHold, &sDataRead, 4, &bytes );
if( !result )
{
RaiseWinErr();
}
memcpy( &lListItemDataHold, &sDataRead, 4 );
lListItemDataHold=lListItemDataHold+6;
ReadProcessMemory( hProcess, (void *)lListItemDataHold, outputResult, 16, &bytes );
CloseHandle( hProcess );
}
}
}
私の理解は、限られていlListItemHold=lListItemHold+24
ますが、ListBox にある「構造」を考慮し、その最初の 24 バイトを通過させて、残っているものを返そうとするということです。しかし、これは私にとってはうまくいかないようです。
誰かが私が試すことができるものに光を当てることができますか? そのままストローを掴んでいるのがわかります。これをC#でコーディングしているので、この関数は次のように使用さp/invoke
れます。
[DllImport("GetListItemData.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern void RetrieveListItem(
System.IntPtr hWnd,
System.Int32 index,
[MarshalAs(UnmanagedType.LPArray)]byte[] buffer
);
[DllImport("GetListItemData.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern void RetrieveListItem(
System.IntPtr hWnd,
System.Int32 index,
[MarshalAs(UnmanagedType.LPTStr)]System.Text.StringBuilder buffer
);