読者です 読者をやめる 読者になる 読者になる

★ The Tsuchinoko News 2 (つちのこ通信2) ★

重要な話から、どうでもいいことまで。ほとんど役に立たないことを書き連ねています。

【PC】VB6 から VB2010 へ移行(その5)プロセス間通信(VB2010での受信)

IT雑感

f:id:tsuchinoko118:20120501061331j:image:w560
前回VB6でのプロセス間通信(受信)を紹介した。窓に投げつけられた PostMessage を処理するため APIなどを駆使して、ユーザー独自のウィンドウプロシージャーをつくって、そこで受信の処理を行い、元のウィンドプロシージャーに制御を戻す、といったことを行った。
受信の処理部分は仕方がないとして、ウィンドウプロシージャーの横取り部分と、元に戻す部分などを、すべて自前で処理しなくてはならず、非常に猥雑なプログラムとなり、なんとも無理矢理感がある。ソースコードも、どうも汚らしくなりがちだ。
VB2010 での受信は、やってることは全く同じだが、もう少し単純に書くことができる。

public strMsg as string

const pmSTART = &h0
const pmDATA = &h1
const pmEND = &h2


Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)


        If m.Msg = "適当な共有名" Then

            Select Case m.WParam

		case pmSTART
	             'メッセージバッファをクリア(送信開始)		
                    strMsg &= ""

                Case pmDATA

                    'メッセージバッファに追加(送信)
                    strMsg &= Chr(m.LParam)

                Case pmEND
	           '受信完了(送信終了)				
		   '========================
                   '
                   ' strMsg が 送られてきた
          ' メッセージなので
          ' 適宜解析するなりする
                   '
		   '========================                    

            End Select

        End If

        MyBase.WndProc(m)

 End Sub

APIのプロトタイプ宣言も何も出てこない。
ただ、あたりまえのように(普通のサブプロシージャのように)WndProc を書いて ユーザープロシージャーのできあがり。処理が終わったら MyBase.WndProc(m) として、もともとの(継承したクラスの)ウィンドウプロシージャーを呼んでいる。
開始も終了も手続きはいらない。

WndProcの中でやっていることは VB6 の時と同じく、pmSTART,pmDATA,pmEND の勝手ルールに応じて、strMsg変数に値をセットしているだけ。

非常に単純で短く書くことができる。

これはひとえに VB2010 では、あからさまにフォームはクラスであり、ユーザーが作成する Windowフォームは そのクラスを継承しているだけ、ということが可能になったことによる。

ともかくこれで VB6 と VB2010 のプロセス間通信は出来るので、大きな資産=VB6のプログラムを(すぐに全部を .NET に出来ない場合などに)追加機能や改造機能をとりつけることができるようになった。
Windows 7 も(どうやら Windows 8も) VB6 の 開発環境(IDE)は動作保証ナシのようだが VB6 の実行プログラムは動くので、徐々に .NET に移行したいところだ。