- ベストアンサー
シリアルポートを使うDLLを複数のアプリから使いたい
- シリアルポートを使用するDLLを複数のアプリケーションから利用する方法についてご質問です。
- 複数のアプリケーションが同じDLLを利用し、同一のシリアルポートを通じて機器と通信することは可能でしょうか。
- 通信頻度が高くない場合、ポートをオープンし通信後にクローズすることで実現できると思われますが、正しいでしょうか。また、通信中にポートをオープンしたまま通信することは可能でしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
DLLはプロセス空間にロードされます。 つまり、複数のプロセスで「共通」という概念は 間違いです。A、BのプロセスがZというDLLを使って いる場合、ZはそれぞれAとBの両方に存在します。 この解決には幾つか方法があります。 (1)サービス Windowsのサービスを使って、機能を提供する方法です。 例えば、FTPサーバとかDBエンジンはこれです。 サービスマネージャにより起動されるので、開始に設定 しておけばWindows起動時に自動的に開始されます。 但し、サービス特有の形式でロードモジュールを作成 しなければなりません。 (2)独立プロセス 普通のプロセスで処理し、外部に窓口を設けます。 サービスもプロセスなので、処理としては同じになります。 多重起動を防ぐには名前付きミューテックスを使って、 これを取得できないか、ポートを開いて負けた方(ロック のため、後から開いた方はエラーになる)がプロセスを 終了するようにすればよいでしょう。 ※サービスは多重起動の心配はありません。 窓口は、ウィンドウを使って、利用者定義メッセージを 送るようにすれば如何でしょう。ウィンドウは非表示に しておきます。利用する方はウィンドウのクラス名で 探します。クラス名は任意に付けられるので、専用の 名前を付けておけば、間違う心配はありません。 ウィンドウは特に定義しなくてもプロセス間で参照可能 です。 あと、シリアルポートの初期設定は簡単で、心配するほど 時間のかかる処理ではありません。何故なら、相手側と 同期を取らないし、TCP/IPと違いアドレス解決もありま せん。
その他の回答 (2)
- nda23
- ベストアンサー率54% (777/1415)
データの受信 利用者側も受け取り用ウィンドウを用意しておけば 如何でしょう?通信プロセスは受信したら、予め 登録されたウィンドウに通知を送るようにします。 想定例: (1)通信開始 W=利用者識別用のウィンドウハンドル L=データ受け渡し用のEditのウィンドウハンドル 戻り値=成功/失敗 誰も使っていない場合は上記のハンドルを登録して、 成功を返す。既に他のプロセスが処理中なら失敗を返す。 (2)送信 W=利用者識別用のウィンドウハンドル L=送信長 戻り値=成功/失敗 通信開始時に受け取ったEditから送信データを受け取って これを送信する。 (3)受信通知(コールバック) W=利用者識別用のウィンドウハンドル L=受信長 戻り値=未使用 通信開始時に受け取ったEditに受信データを設定後、 利用者識別用ウィンドウに通知を送る。 (4)通信終了 W=利用者識別用のウィンドウハンドル L=未使用 戻り値=成功/失敗 通信機能を未使用状態にする。 (1)、(2)、(4)は利用者プログラムが通信プロセスへ SendMessageし、(3)は通信プロセスから利用者の プログラムにSendMessageします。こうすれば問題の ポーリングをすることなく処理できるでしょう。
お礼
ありがとうございます。 十分なヒントをいただきましたので、何とかなりそうです。 本当に助かりました。
- D-Matsu
- ベストアンサー率45% (1080/2394)
実際にやってみればすぐわかる事ですが、COMポートをオープンするとロックされて他のプロセスからは開けなくなります。 ですから面倒でもその都度オープン・クローズしなければ駄目です。 逆に、適切にオープン・クローズしていれば複数のプロセスで扱うことに問題はありません。 DLLの共有についてはDLL自体がステータスを内部に抱えているのでなければ問題なく使えますし、内部に持っていたとしても複数プロセスが使うことを見越した持ち方をしていれば問題はありません。 要はDLLがリエントラントに作ってあれば大丈夫、ということです。
お礼
ありがとうございました。 複数のプロセスで使うにはオープン、クローズが絶対に必要ということですね。 了解しました。
お礼
なるほど、通信するプロセスを1つ起動しておいて、他のアプリからメッセージでコントロールするわけですね。 ところで、受信データの受け取りについてアドバイスがいただければ幸いです。受信データは送信のレスポンスとして戻ってくる数バイトです。通信プロセスが特定のTextBOXにデータを入れて、送信したアプリがそれを取り出すというので出来ると思うのですが、私の知識ではポーリングしか思いつきません。