Written in Japanese(UTF-8)
2014.8.30
INASOFT


/トップ/ListView to CSV/ダウンロード/WebHelp/ヘルプトップ

このプログラムの動作原理


1.リストビューを探す方法

Windows上で動作するプログラムに含まれる様々な部品は、「ウィンドウ」として管理されています。これは、通常、Windows上で目にする「ウィンドウ」と同様のオブジェクトとして存在し、ウィンドウハンドルを用いて管理されるものです。

そのため、リストビューを探すには、ウィンドウと子ウィンドウを列挙するためのAPIである、EnumWindow() APIとEnumChildWindow() APIを用いて、クラス名が WC_LISTVIEW("SysListView32")となっているウィンドウを探せばよいことになります。

2.リストビューから情報を得る方法

リストビューもウィンドウの一種であるので、1の方法で得られたウィンドウハンドルに対して、SendMessage() APIを用いてメッセージを投げることで、情報を取得することができます。例えば、リストビュー内に存在するアイテムの個数を取得するには、LVM_GETITEMCOUNT メッセージを投げます。

SendMessage(hListView, LVM_GETITEMCOUNT, 0, 0);

しかし、この方法では、リストビューから数値を取得することはできても、文字列を取得することはできません。

3.リストビューから文字列を得る方法

他のプロセス上で実行されているリストビューから、単純に文字列を取得することはできません。これは、次のような理由があるためです。

文字列は一般に、多くのバイトからなるデータです。そのため、文字列は数値のように単純に取得できるものではなく、「○○のアドレスから始めるメモリエリアに、文字列データを書き込んでくれ」とお願いすることになります。

しかし、プロセスが違うと、メモリが別領域になります。日常的な住所でたとえるならば、南区1234番地と、西区1234番地は、同じ1234でも同じ場所ではないといったところです。すなわち、あるプロセスで 0x11223344 と示されているメモリ上のアドレスに対しては、別のプロセスから 0x11223344 というアドレスではアクセスできないことになります。

つまり、文字列を読み出したいプロセスが、文字列格納用としてメモリ確保を行い、0x11223344 というアドレスを取得したとしても、リストビューを保持しているプロセスがそのアドレスへアクセスできるわけではないため、文字列を取得することができないのです。

不正なメモリアクセスとなり、強制終了させられてしまう
 そこで対策を講じます。対策は、Windows NT系であるのか、それとも Windows 95/98/Meであるのかにより、方法が異なります。まずは、Windows NT系の方から説明します。

3.1.VirtualAllocEx/ReadProcessMemoryによる方法(Windows NT系)

VirtualAllocEx()は、指定したプロセスにメモリ確保を行わせるためのAPIです。そして、ReadProcessMemory()は、指定したプロセスからメモリの内容を読み込むためのAPIです。

これらを組み合わせて、リストビューから文字列を得ることができます。

ReadProcessMemoryの原理

原理としては、これで文字列を読み出すことができますが、これでは不十分です。

リストビューから文字列を取得するためには、LVM_GETITEM メッセージを使いますが、このメッセージは指示を受けるための構造体へのポインタを受け取ります。このポインタも、相手先プロセス内のメモリにある必要があります

そのため、この構造体自体も、VirtualAllocExを使って相手先プロセス内にメモリ確保し、WriteProcessMemory() を使って指示データを書き込みます。

3.2.ファイルマッピングオブジェクトによる方法(Windows 95/98/Me)

CreateFileMapping()/MapViewOfFile() は、ファイルマッピングオブジェクトを作成し、メモリに結びつけるためのAPIです。これは、プロセス間共有メモリとして扱うことができます。

ファイルマッピングオブジェクト

3.1と同様に、指示を与えるための構造体も、このファイルマッピングオブジェクト内に作成します。


 目次へ

※このページは、ソフトウェアに付属のヘルプファイルをWeb用に再構築したものです。大部分に自動変換を施しているため、一部は正しく変換しきれずに表示の乱れている箇所があるかもしれませんが、ご容赦下さい。また、本ドキュメントはアーカイブドキュメントであり、内容は、右上の作成日付の時点のものとなっております。一部、内容が古くなっている箇所があるかと思いますが、あらかじめご了承下さい。
※このページへは、自由にリンクしていただいてかまいません。

■このページに関するご意見をお待ちしております → フィードバックページ

/トップ/ListView to CSV/ダウンロード/WebHelp/ヘルプトップ