pluginからのttset構造体へのアクセスずれる
対応するバージョンのソースコードを使ってプラグインをビルドしてください。
新旧どちらのバージョンでも同じpluginを使いたかったのですが、以下の方法にすることにしました。
tttset 構造体を参照せずに、TERATERM.INIファイルを読み込むタイミングで plugin側で"AutoComPortReconnect"を確認するようにしました。
お手数をおかけしました。ありがとうございます。
ちなみにですが、Tera Term 4.98 のソースコードでビルドしたプラグイン(tttset 構造体を参照するもの)は、4.105 で動作しますか?
私は内部に詳しくありませんが、古いソースコードでビルドしたプラグインは新しい Tera Term でも動作することが想定されているはずです。(そういう意味で「対応するバージョンの~」と書きましたが、説明が十分ではありませんでしたね。)
今回のように逆の場合は、構造体の拡張がありうるので難しいことが想定されます。(OPENFILENAME 構造体 の lStructSize などもそうですよね)
確認しましたので報告します。
build:v4.98
build:v4.105
前のコメントで報告した内容でも両方のバージョンのTeratermで動作を確認出来たため、目的はクリアできましたが 別の方法(ttset構造体で無理やり対応)を実装してみました。
https://osdn.net/users/tomo3136/pf/ttxreconnect/wiki/FrontPage
※アライメント等何も考慮していないのできれいなやり方ではありませんが。
当方オープンソースに上げるのは初めてのため、とりあえず作業部屋に上げてみました。至らない点がありましたらご了承願います。
OPENFILENAME 構造体 の lStructSize を調べてみました。
拡張時はバージョンアップにより構造体の末尾にメンバを追加していくようです。 いつも固定値を設定するため様式美としてあまり気にしていませんでした。
lStructSizeでサイズを指定することでメモリ例外を起こしにくいようにしているようです。 また、追加メンバーより前のメンバの位置が同じならば、古いAPIの呼び出しでは追加部分は無視扱いにでき、新しいAPIの呼び出しではlStructSizeが想定より小さい値となるため、エラーにするなり互換モードで動かすなりができるようにしているものと思われます。(うまいこと考えたものです)
Teratermのtttset構造体も何度か大きな変更をしているようですが、基本的には構造を保持し、同じように末尾にメンバを追加しています。
ただ、TeratermのV4.105においては、結果的に tttset 構造体の途中にメンバが追加された形となり、以降の位置がずれてしまうため、単純に上記のような使い方はできず、Tera Termのバージョンごとに用意が必要かなと思っていました。
前のコメントのコードでは、tttset構造体にlStructSizeのように識別子として使えるものがない(v4.105ではRunningVersionが追加されている)ため、実行プログラムのバージョンを識別子として使用し、古ければ(ここではv4.105未満)指定位置以降のアドレスを強制的に構造体のメンバ位置を調整するマクロに変えてみた次第です。
確認しましたので報告します。
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/
もう少し手直しして 4-stable に修正をマージしました。
r9112 です。確認いただけないでしょうか。
Tera Term 5 では文字列をUnicodeにすることになると思いますし 長いパス名に対応したいので構造体がずれることは確定的です。
プラグインが情報を得るときに構造体を参照するのではない 別の方法がのぞましいなと思っていますが手が回っていません。
確認しましたので報告します。
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 のみ。
Tear Term 5 では構造体がずれますか、、
ネットを探しても、プラグインはここ以外で見つけることができなかったので メジャーバージョンアップなら、影響出ても仕方ないかなと思います。 8つほどプラグインを作りましたが、私的には必要なら移植するだけです。(同等のI/Fの提供ならば、作業するしないだけなので)
私の主要用途は UART 通信のため、割り切って使っています。 (作ったプラグインのいくつかは、パス名を扱いますが割り切って日本語禁止にしている)
確認ありがとうございます。
つぎのリリースに反映されます。
# Tera Term の内部状態を取得するAPIを追加したらどうかなぁ…
参考までに私が使用している構造体メンバーは以下でした。
tttset 構造体読み込みのみ
HomeDir, LogFN, MacroFN, HostName, Title, PortType, TCPPort, ComPort, UILanguageFile, AutoComPortReconnect
tttset 構造体読み込み・書き込み
SetupFName, KeyCnfFN
TComVar 構造体読み込みのみ
HWin
TKeyMap, TGetHNRec 構造体
未使用
反映、ありがとうございます。
普段 Teraterm 4.98 を使用してます。 AutoComPortReconnect の時、接続開始待ち時間を指定できるようにするだけのpluginを自作しました。 Teraterm 4.105 で自作pluginをビルドしましたが、 pluginの呼び出しTTXInit()で取得できる tttset 構造体の eterm_lookfeel_t EtermLookfeel; 以降は4バイトずれ、旧版の構造が引き継がれなくなっています。 r8106で追加した構造体変数の影響のようです。