dポイントプレゼントキャンペーン実施中!

始めて質問いたしますので宜しくお願い致します。

ターミナルサーバー(Windows Server 2003 R2 SP2)上でVB5のアプリを動かしています。
FormからMSCommのコマンドにて通信ポート(COM1)のラベルプリンタ(SATO SR412)に
印刷を行うのですが1回目の印刷ではポートも正常に開けて印刷されますが
フォームを閉じずにそのまま2回目を印刷した際に8012(デバイスが開けません)のエラーが
発生し印刷できません。
フォームを閉じると印刷は可能となります。

Windows XP SP3上で同じVB5のアプリを動かすとフォームを閉じなくても2回目の印刷が可能
となります。
ターミナルサーバー側の設定をどのように変更すればエラーが発生せず
印刷できるかご教授頂ける方、宜しくお願い致します。

ちなみにマイクロソフトのパッチ:838291は適用しています。

【デバッグを行った状態】
MSCommのコマンドにてデバッグを行った際、1回目の印刷時にはメッセージBOXで
状態を表示致しましたが正常にPortOpen=FALSEとなりポートがクローズされています。
2回目の印刷時にもポートがオープンされている場合にもPortOpen = Falseにて
一度、クローズしたのちPortOpen = Trueにて開こうとしていますがエラーとなります。

実行のコマンドは以下となります。
With X_oMSComm
If .PortOpen = True Then
.PortOpen = False
End If
.CommPort = 1
.DTREnable = True
.RTSEnable = True
.NullDiscard = False
.Settings = "9600,N,8,1"
.Handshaking = 0
.SThreshold = 0
.RThreshold = 0
.InputLen = 0
.PortOpen = True  ← このコマンドにてエラーとなります。
End With

A 回答 (2件)

同じ環境(ターミナルサーバ)で使ったことがあるわけではないので確証は何もありませんが



・回線クローズ・オープンの間に一定時間のwaitを入れたらどうなるでしょうか
 (Sleepもしくは仮にボタン操作などでクローズ・オープンのイベントを分ける)

もしそれで動くのであればターミナルサーバ上の操作ということで
処理に何らかの遅延などが発生するのかもしれません

>ターミナルサーバー上でCOMポートをオープンしたままにしますと他のユーザーより使用する際にオープンできない
そりゃそうです(これは別にターミナルサーバに限った話ではありません)
複数ユーザで同じアプリ使うなら確かに占有されるので使う時だけ
オープン/クローズしないとリソースが占有されてしまいますが
書かれてるコードだとほとんど占有に近くなるのでは?
  (テストコードとして書かれてるのなら良いんですが)
  使い終わってすぐクローズしてるならそもそも再オープンなど不要だし
  (念のためとかいう事ならこれまた支障なし)
  自分以外のプログラムでリソース占有されてたら再オープンでエラーになります
  (クローズはそのまま動くはず)

と書いて(多分ないとは思うけど)気になる点が一つ出ました
他のユーザなどでリソース占有してるとかいう事は無いですよね?

私にはそれぐらい使思いつきません
    • good
    • 0
この回答へのお礼

koi1234さん。
連絡が遅くなりましたが一定期間でのwait等試しましたが同様のエラーとなりました。
もう少し調べました所、何故このような動きになるかわかりませんが2回目に印刷指示を行った際、
ターミナルサーバー上でCOMポートをオープンするとターミナルサーバー上のCOMポートが見えなくなることが判明致しました。
回避策として印刷処理(MSCommにて制御する処理)を別のフォームに切り出すことにより、2回目でも印刷させる事ができました。
(フォームの動きとしてはメインのフォームで対象データを抽出した後、サブフォームにて印刷指示を行います。1回目の印刷処理が終了した後、
サブフォームはクローズしメインフォームに遷移します(この時点でCOMポートが通信可能となります)。
2回目に印刷指示を行う際は、再度、メインフォームからサブフォームに遷移します。この動きにより1回目、2回目を意識せずCOMポートが
通信可能な状態となります。
ターミナルサーバー上同一フォームで再オープンした際にCOMポートが見えなくなるのかは不明でしたのでこのような逃げ方をしました。

情報を頂きありがとうございました。

お礼日時:2011/07/08 13:09

何でエラーになるのかの追求にはなってません



プログラムの仕様にもよってくるので何とも言えませんが
アプリ起動中はずっとオープンにしておく方が一般的ではないかと思いますが
それでは問題があるのでしょうか?(わざわざクローズする必要がありますか?)

この回答への補足

koi1234さん連絡ありがとうございます。

情報不足で申し訳ありません。
ポートがオープンできない状況を調査した際に切り分けとしてローカルでも同様の箇所でエラーになるのかそれともターミナルサーバー上のみでエラーとなるかをまず区別しました。その上でどのコマンドにてエラーとなっているかを調べた際にMSCommのオープン時にエラーとなっていました。

又、ターミナルサーバー上でCOMポートをオープンしたままにしますと他のユーザーより使用する際にオープンできないとの情報よりこのような作りとしています。

このようなエラーのケースの場合にはどのようにしてエラーを究明すればよいかアドバイスを頂ければと思います。

宜しくお願い致します。

補足日時:2011/06/28 08:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!