tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^5: 外部アプリのコンボボックスのテキスト取得
投稿日: 2013/08/19(Mon) 19:53
投稿者魔界の仮面弁士
> 上記の方法はネット上で配布されていたCB_GETLBTEXTの
> 例を使用したもので、この記述で確保できるものと
String 型で受け取るとしたら、
 「Dim strItemText As String * 想定される最大長」
で宣言されるか、もしくは
 「Dim strItemText As String」
で宣言されたあと、String関数や Space関数などで、バッファを動的確保していたはずです。
Unicode 対応などの場合は、String の代わりに Byte 配列を使うパターンもありますね。


> strItemText=Space$(lngLen+1)
> あっていますでしょうか?

自アプリ内なら、同じメモリ空間で済むので Space$ でも String$ でも良いですが、
今回はプロセスを跨ぐメモリ空間なので、それだけでは不十分「かも」知れません。
各プロセスが読み書きするメモリ空間は、それぞれ個別に用意されているからです。

一部の Windows メッセージ(WM_GETETEXTなど)においては、プロセス間のメモリ管理を
自動的に行ってくれるものもあるのですが、CB_GETLBTEXT がそうであるかは未調査です。
少なくとも TreeView や ListView の場合は、ファイルマッピングオブジェクトなり
共有メモリなりを使ってやりとりする必要がありました。


WinXP なら、VirtualAllocEx で対象プロセスの仮想アドレス空間にメモリ領域を確保し、
それをバッファとして WriteProcessMemory でその中身を編集(ゼロクリアなど)しておき、
確保したアドレスを SendMessage にてコントロールに送出した後、それによって
書き換えられたバッファの内容を ReadProcessMemory でローカルのメモリにコピーしてから
使い終わったメモリを VirtualFreeEx で解放する…という流れでどうでしょうか。
(Win9x 系をサポートする場合は少々異なる処理が必要になるかも)

それと、Unicode / ANSI 変換の有無についても忘れずに。
(この辺は、SendMessageA を使うか SendMessageW を使うかで変わってきます)


以下、Visual Basic 向けの情報ではないですが一応参考までに。
http://home.netyou.jp/cc/susumu/shrmem.html
http://japan.internet.com/developer/20050830/26.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20071107/286607/
http://wisdom.sakura.ne.jp/system/winapi/win32/win150.html


> 「問題が発生したためVisualBasicを終了します」となります。
開発環境からではなく、EXE 単体で実行した場合に、何のエラーになったかが
知りたかったのですが、おそらくは文字列バッファへの書き込みに失敗し、
前回回答した「Access Violation」が発生しているのではないかと予想しています。
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E4%BF%9D%E8%AD%B7

想定されるエラーメッセージの例としては、このような物があります。
・「一般保護違反」あるいは「ページ違反」 (主に Win9x)
・「保護されているメモリに読み取りまたは書き込み操作を行おうとしました」
・「0x00000005: アクセスが拒否されました。」(ERROR_ACCESS_DENIED)
・「ハンドルされていない例外は "アプリ名.exe" にあります: 0xC0000005 : Access Violation」

# 0xC 系で始まるもの(10進だと -1 始まりのもの)は Win32 系のエラー
# 0x8 系で始まるもの(10進だと -2 始まりのもの)は ActiveX/COM 系のエラー

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。