Incidencia #40978

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

Abrir Fecha: 2020-11-17 22:32 Última actualización: 2020-12-29 06:19

Informador:
Propietario:
Tipo:
Estado:
Cerrado
Componente:
Prioridad:
5 - Medium
Gravedad:
5 - Medium
Resolución:
Fixed
Fichero:
Ninguno
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/15 Histories)

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

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

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

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

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

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

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

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

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

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

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

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

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
Comentario

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 Updated by: zmatsuo
  • Hito Update from (Ninguno) to Tera Term 4.106
  • Resolución Update from Ninguno to Accepted
  • Propietario Update from (Ninguno) to zmatsuo
Comentario

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

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

試してみてください。

2020-12-11 01:34 Updated by: tomo3136
Comentario

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

plugin build:r9042

running:v4.98 ⇒〇動作する

running:v4.104 ⇒〇動作する

running:v4.105 ⇒×動作しない

修正内容通りv4.105 以外でプラグインを動作させることができました。

また、簡易的にTTSet構造体がずれているか確認するプラグインを作って確認しました。

https://osdn.net/users/tomo3136/pf/TTXEstimateMismatch/scm/tree/master/

2020-12-21 01:53 Updated by: zmatsuo
Comentario

もう少し手直しして 4-stable に修正をマージしました。

r9112 です。確認いただけないでしょうか。

Tera Term 5 では文字列をUnicodeにすることになると思いますし 長いパス名に対応したいので構造体がずれることは確定的です。

プラグインが情報を得るときに構造体を参照するのではない 別の方法がのぞましいなと思っていますが手が回っていません。

2020-12-24 07:12 Updated by: tomo3136
Comentario

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

plugin build:4-stable r9112

running:v4.98 ⇒〇動作する

running:v4.104 ⇒〇動作する

running:v4.105 ⇒×動作しない

結果は同じことを確認しました。修正内容通りv4.105 以外でプラグインを動作させることができました。

ビルド環境は、Windows10 64-bit, Visual Studio 2019, SDK 10(cmake時) および 8.1(sln使用時), のみ。 r9112 ソースコードからはインクルードファイルのみ使用してビルド (ttpcmn とかは未使用)

実行環境は、Windows10 のみ。

2020-12-24 07:54 Updated by: tomo3136
Comentario

Tear Term 5 では構造体がずれますか、、

ネットを探しても、プラグインはここ以外で見つけることができなかったので メジャーバージョンアップなら、影響出ても仕方ないかなと思います。 8つほどプラグインを作りましたが、私的には必要なら移植するだけです。(同等のI/Fの提供ならば、作業するしないだけなので)

私の主要用途は UART 通信のため、割り切って使っています。 (作ったプラグインのいくつかは、パス名を扱いますが割り切って日本語禁止にしている)

2020-12-28 22:51 Updated by: zmatsuo
Comentario

確認ありがとうございます。

つぎのリリースに反映されます。

# Tera Term の内部状態を取得するAPIを追加したらどうかなぁ…

2020-12-28 22:52 Updated by: zmatsuo
  • Estado Update from Open to Cerrado
2020-12-28 22:58 Updated by: zmatsuo
  • Resolución Update from Accepted to Fixed
2020-12-29 06:19 Updated by: tomo3136
Comentario

参考までに私が使用している構造体メンバーは以下でした。

tttset 構造体読み込みのみ

HomeDir, LogFN, MacroFN, HostName, Title, PortType, TCPPort, ComPort, UILanguageFile, AutoComPortReconnect

tttset 構造体読み込み・書き込み

SetupFName, KeyCnfFN

TComVar 構造体読み込みのみ

HWin

TKeyMap, TGetHNRec 構造体

未使用

反映、ありがとうございます。

Attachment File List

No attachments

Editar

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