VC++6.0、Win2000 MFC です。
シリアル通信するDLLを作っています。DLLでポートオープン・リード・ライト・クローズを行います。
複数プロセスからDLLが呼ばれることがあるのですが、あるプロセスからの要求でポートをオープンし、開いた状態で他のプロセスで同ポートを使って通信を行うことは可能でしょうか?つまりポートをDLLを介してプロセス間で共有するのは可能でしょうか。
現在は、1回の通信ごとにオープン/クローズして対応してますが、通信が頻繁に行われるのでオープンしたまま動かしたいのです。
よろしくお願いします。
シリアルポートってそもそも PC-MODEM 間の接続のように1対1を想定してますから
共有ってのがよくわからないです。どういう使用方法なんでしょうか?
# ポート=回線だから。そこを流れるデータは複数セッションありうるだろうけど。
DLL 側にポートの擬似open回数を共有変数で持たせて
アプリケーション側はDLLの擬似openを起動時に1回、終了時に擬似closeを1回呼ぶ。
DLLはオープン回数0->1で真にOpen、 1->0で真にClose
で十分共有できます。
MFCですので・・・ActiveX EXEでも可能かと思いますが・・・
簡単?にと言うのであれば・・・
COMポートと通信する普通のEXEに対し、他のプロセス(EXE)は、
通信EXEと、ネットワーク通信(UDP)で行うと言うのは如何でし
ょう?
実際、昔、とある仕事で作りました。
他マシンからでも可能となりますが。
参考までに・・・
以上。
tetrapodさんありがとうございます。
すみません、説明がへたでした。
>シリアルポートってそもそも PC-MODEM 間の接続のように1対1を想定してますから
>共有ってのがよくわからないです。どういう使用方法なんでしょうか?
複数のアプリケーションで同じ通信処理を行うので、あるアプリケーションが開けたポートを他のアプリケーションでも使用したいのです。
>DLLはオープン回数0->1で真にOpen、 1->0で真にClose
>で十分共有できます。
真にオープンしたポートを他のアプリケーションがどうやって判別できるのでしょうか?
オショウさんありがとうございます。
>COMポートと通信する普通のEXEに対し、他のプロセス(EXE)は、
>通信EXEと、ネットワーク通信(UDP)で行うと言うのは如何でし
>ょう?
今回は仕様から外れてしまうので出来そうにないですが、
そういう方法もあるのですね。参考になります。
え?どれかのアプリケーションが1つでも開いていれば常に open つまり、
アプリケーションが生きていればずっと open になるわけで判別不要ですが。
# 非通信中はポートを空けておきたいなら別対策が必要
COMポートは、SHAREDモードで共有オープンできません。
フィルタードライバーとか書いて、擬似的にSHARED可能なように
はできると思いますが、先のネットワーク通信を利用するより、
はるかに高度な知識・技術が必要です。
私はたまたまデバドラ作りますので・・・ドライバーの構造は、
知っていますが、なすびさんの行いたいことは、既に通常の可能
な方法を逸脱した仕様となっていますので、仕様から外れる・・・
以前の問題です。
ご検討下さい。
以上。
うーん、そんなに難しい話をしてるのでしょうか?
COM1 の先に Ethernet のようなマルチドロップな回線がある場合を想定すれば
ダイアルアップ接続で Internet に接続しているときのように COM1 を1回線使うだけで
IE/FTP/PING/TELNET を (擬似的に) 同時に使うことは可能です。
そういう時分割用途でよいなら先に述べたとおり参照回数カウンタ使うだけでいい。
まぁ案件がはっきりしないのにテキトーなことを言ってもしょうがないのでここらで撤退。
複数のアプリから(同時に?)呼ばれると言う事は、DLLでキュー制御なりアプリ側でリトライ制御なり有ると言う事ですよね。
私だったら、DLLの立場を配信マネージャにしちゃって、要求元を識別出来る様なI/Fを持ってキュー制御で通信→配信とかさせるかな・・
そうすれば、DLL側はOPENしっぱなしでアプリ側が要求(擬似OPEN)、要求の終了(擬似CLOSE)とか、もちろん通信自体もDLL経由で行う必要は有りますが・・