1

外部アプリケーション ( 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
    );
4

1 に答える 1

1

このトピックに関する2つのブログ投稿があります

http://taylorza.blogspot.com/2009/08/archive-hacking-my-way-across-process.html http://taylorza.blogspot.com/2010/06/crossing-process-boundary-with-net .html

ただし、これらは ListView コントロール用ですが、コードを確認することをお勧めします。2 番目の投稿では、P/Invoke を使用して .NET でこれを実現しています。

1- なぜ lListItemHold に 24 を追加するのですか?

2- lListItemhold が文字列へのポインタであることは確かですか。アプリケーションの内部構造である可能性があります。

于 2011-01-13T14:16:48.040 に答える