チケット #40978

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

登録: 2020-11-17 22:32 最終更新: 2020-12-03 00:14

報告者:
担当者:
チケットの種類:
状況:
オープン [担当者決定済み]
コンポーネント:
マイルストーン:
優先度:
5 - 中
重要度:
5 - 中
解決法:
受領
ファイル:
なし
投票
点数: 0
No votes
0.0% (0/0)
0.0% (0/0)

詳細

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

チケットの履歴 (7 件中 3 件表示)

2020-11-17 22:32 更新者: tomo3136
  • 新しいチケット "pluginからのttset構造体へのアクセスずれる" が作成されました
2020-11-21 00:12 更新者: nmaya
コメント

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

(編集済, 2020-11-21 00:12 更新者: nmaya)
2020-11-21 18:43 更新者: tomo3136
コメント

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

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

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

2020-11-22 16:41 更新者: nmaya
コメント

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

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

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

2020-11-23 17:13 更新者: tomo3136
コメント

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

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 更新者: tomo3136
コメント

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

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

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

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

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

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

2020-12-03 00:14 更新者: zmatsuo
  • 担当者(未割り当て) から zmatsuo に更新されました
  • 解決法なし から 受領 に更新されました
  • マイルストーン(未割り当て) から Tera Term 4.106 に更新されました
コメント

ttset構造体を調整しました (r9042)。

Tera Term 4.98 向けビルドで 4.105 で使えるようになっていると思います。

試してみてください。

添付ファイルリスト

添付ファイルはありません

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする