【PC】VB6 から VB2010 へ移行(その5)プロセス間通信(VB2010での受信)
前回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 に移行したいところだ。