Ticket #36712

loginfoでログファイル名が取得できない

Open Date: 2016-10-12 19:37 Last Update: 2016-11-30 21:28

Reporter:
(Anonymous)
Owner:
(del#24082)
Type:
Status:
Closed
Component:
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
Fixed
File:
None
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Details

■事象

次のTERATERM.INIを"ライブラリ\ドキュメント"ディレクトリに配置し、 TEST.BATを実行し続けると、LOGFILE_NAMEが取得できない時がある。 事象は数分で発生する時もあれば、数時間経ってから発生する時もある。

=== TERATERM.INI ===
[Tera Term]
LogDefaultName=%Y%m%d_%H%M%S.log
LogDefaultPath=E:\Logs\TeraTerm
LogAutoStart=on

=== TEST.BAT ===
:START
"C:\Program Files\teraterm\ttpmacro.exe" "C:\Temp\test.ttl"
goto START

=== TEST.TTL ===
connect '192.168.0.1:22 /ssh2 /auth=password /user=hoge /passwd=hoge'
pause 1
waitregex '.+'
loginfo LOGFILE_NAME
if result <> -1 then
  strmatch LOGFILE_NAME '\.log$'
  if result == 0 then
    messagebox LOGFILE_NAME 'Could not get logfile name.'
  endif
endif
sendln 'exit'
exit

■環境

TeraTermバージョン: 4.92

OS: Windows 7 Enterprise with Service Pack 1 で、Windows Updateは最新の状態。

■原因

ttmdde.cのGetTTParamで、DdeClientTransactionとDdeGetLastErrorの戻り値は通常、

DdeClientTransaction戻り値: 0以外
DdeGetLastError戻り値: 0
になるが、まれに
DdeClientTransaction戻り値: 0以外
DdeGetLastError戻り値: DMLERR_EXECACKTIMEOUT
になる。

DdeGetLastError戻り値がDMLERR_EXECACKTIMEOUTであっても、 後続のDdeAccessDataでログファイル名を取得できるのだが、 GetTTParamではエラーと判定してしまうので、Paramが不定となる。

Ticket History (3/11 Histories)

2016-10-12 19:37 Updated by: None
  • New Ticket "loginfoでログファイル名が取得できない" created
2016-10-20 22:18 Updated by: (del#24082)
Comment

報告どうもありがとうございます。

Windows7 Professionalですが、再現しませんでした。 流した時間が足りてなかったかもしれないので、再度再現試験してみる予定です。

本件はちょっと原因がよく分かりません。 DdeClientTransaction関数でタイムアウト時間(5秒)が足りず、関数がタイムアウト しているのかもしれません。関数がエラーしても、DdeAccessData関数でデータが 取得できるとのことなので、処置をするにもどうしたものか思案中です。

2016-10-22 21:42 Updated by: None
Comment

yutakaponさん、着手いただきありがとうございます。

DdeGetLastError関数でのエラー判定が不要ということはないでしょうか?

Dde関数の戻り値がエラーとなった時に、その理由を知るためにDdeGetLastError関数を使用するものと思っていたのですが...。

2016-10-22 22:15 Updated by: (del#24082)
Comment

None への返信

DdeGetLastError関数でのエラー判定が不要ということはないでしょうか? Dde関数の戻り値がエラーとなった時に、その理由を知るためにDdeGetLastError関数を使用するものと思っていたのですが...。

分かりました。ifの条件式にバグがありますね。
指摘ありがとうございます。直します。

2016-10-22 23:18 Updated by: (del#24082)
Comment

修正しました。以下にアーカイブも置いています。

http://ttssh2.osdn.jp/snapshot/snapshot-20161022.zip

2016-10-23 15:56 Updated by: None
Comment

yutakaponさん、ご苦労様です。

アーカイブ版で数時間動作を数回試し、事象が発生しないことを確認しました。

お忙しい中、ご対応いただき、どうもありがとうございました。

2016-10-23 16:03 Updated by: (del#24082)
Comment

動作確認どうもありがとうございました。

今回もソースコードのチェックをしていただき、とても助かりました。

ちなみに、当方の環境(Win7 Pro)では、再現試験を3時間行いましたが、

再現しませんでした。何か発生条件があるのかもしれません。

2016-10-23 16:04 Updated by: (del#24082)
  • Resolution Update from None to Fixed
2016-10-24 23:54 Updated by: None
Comment

VMware Workstationで仮想マシンを作成し、Windows 7 Professional with Service Pack 1のインストール直後の状態と、Windows Update最新の状態とで試したところ、両方で再現しました。

TeraTermだけをインストールした状態ですので、お時間があるようでしたら、お試しいただければと思います。

2016-10-25 23:48 Updated by: (del#24082)
Comment

情報どうもありがとうございます。

参考にさせていただきます。

2016-11-30 21:28 Updated by: (del#24082)
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2016-11-30 21:28

Attachment File List

No attachments

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login