Ticket #40978

pluginからのttset構造体へのアクセスずれる

Open Date: 2020-11-17 22:32 Last Update: 2020-11-23 19:52

Reporter:
Owner:
(None)
Type:
Status:
Open
Component:
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
None
File:
None
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Details

普段 Teraterm 4.98 を使用してます。 AutoComPortReconnect の時、接続開始待ち時間を指定できるようにするだけのpluginを自作しました。 Teraterm 4.105 で自作pluginをビルドしましたが、 pluginの呼び出しTTXInit()で取得できる tttset 構造体の eterm_lookfeel_t EtermLookfeel; 以降は4バイトずれ、旧版の構造が引き継がれなくなっています。 r8106で追加した構造体変数の影響のようです。

Ticket History (3/6 Histories)

2020-11-17 22:32 Updated by: tomo3136
  • New Ticket "pluginからのttset構造体へのアクセスずれる" created
2020-11-21 00:12 Updated by: nmaya
Comment

対応するバージョンのソースコードを使ってプラグインをビルドしてください。

(Edited, 2020-11-21 00:12 Updated by: nmaya)
2020-11-21 18:43 Updated by: tomo3136
Comment

新旧どちらのバージョンでも同じpluginを使いたかったのですが、以下の方法にすることにしました。

tttset 構造体を参照せずに、TERATERM.INIファイルを読み込むタイミングで plugin側で"AutoComPortReconnect"を確認するようにしました。

お手数をおかけしました。ありがとうございます。

2020-11-22 16:41 Updated by: nmaya
Comment

ちなみにですが、Tera Term 4.98 のソースコードでビルドしたプラグイン(tttset 構造体を参照するもの)は、4.105 で動作しますか?

私は内部に詳しくありませんが、古いソースコードでビルドしたプラグインは新しい Tera Term でも動作することが想定されているはずです。(そういう意味で「対応するバージョンの~」と書きましたが、説明が十分ではありませんでしたね。)

今回のように逆の場合は、構造体の拡張がありうるので難しいことが想定されます。(OPENFILENAME 構造体 の lStructSize などもそうですよね)

2020-11-23 17:13 Updated by: tomo3136
Comment

確認しましたので報告します。

build:v4.98

running:v4.98 ⇒〇動作する
running:v4.105 ⇒×動作しない

build:v4.105

running:v4.98 ⇒×動作しない
running:v4.105 ⇒〇動作する

前のコメントで報告した内容でも両方のバージョンのTeratermで動作を確認出来たため、目的はクリアできましたが 別の方法(ttset構造体で無理やり対応)を実装してみました。

https://osdn.net/users/tomo3136/pf/ttxreconnect/wiki/FrontPage

※アライメント等何も考慮していないのできれいなやり方ではありませんが。

当方オープンソースに上げるのは初めてのため、とりあえず作業部屋に上げてみました。至らない点がありましたらご了承願います。

2020-11-23 19:52 Updated by: tomo3136
Comment

OPENFILENAME 構造体 の lStructSize を調べてみました。

拡張時はバージョンアップにより構造体の末尾にメンバを追加していくようです。 いつも固定値を設定するため様式美としてあまり気にしていませんでした。

lStructSizeでサイズを指定することでメモリ例外を起こしにくいようにしているようです。 また、追加メンバーより前のメンバの位置が同じならば、古いAPIの呼び出しでは追加部分は無視扱いにでき、新しいAPIの呼び出しではlStructSizeが想定より小さい値となるため、エラーにするなり互換モードで動かすなりができるようにしているものと思われます。(うまいこと考えたものです)

Teratermのtttset構造体も何度か大きな変更をしているようですが、基本的には構造を保持し、同じように末尾にメンバを追加しています。

ただ、TeratermのV4.105においては、結果的に tttset 構造体の途中にメンバが追加された形となり、以降の位置がずれてしまうため、単純に上記のような使い方はできず、Tera Termのバージョンごとに用意が必要かなと思っていました。

前のコメントのコードでは、tttset構造体にlStructSizeのように識別子として使えるものがない(v4.105ではRunningVersionが追加されている)ため、実行プログラムのバージョンを識別子として使用し、古ければ(ここではv4.105未満)指定位置以降のアドレスを強制的に構造体のメンバ位置を調整するマクロに変えてみた次第です。

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