pluginからのttset構造体へのアクセスずれる
Eröffnet am: 2020-11-17 22:32
Letztes Update: 2020-11-23 19:52
Auswertung: | tomo3136 | Verantwortlicher: | (Keine) |
---|---|---|---|
Priorität: | 5 - Mittel | Meilenstein: | (Keine) |
Typ: | Fehler | Schweregrad: | 5 - Mittel |
Komponente: | Tera Term | Status: | Offen |
Lösung | Keine |
Einzelheiten
普段 Teraterm 4.98 を使用してます。 AutoComPortReconnect の時、接続開始待ち時間を指定できるようにするだけのpluginを自作しました。 Teraterm 4.105 で自作pluginをビルドしましたが、 pluginの呼び出しTTXInit()で取得できる tttset 構造体の eterm_lookfeel_t EtermLookfeel; 以降は4バイトずれ、旧版の構造が引き継がれなくなっています。 r8106で追加した構造体変数の影響のようです。
Kommentar
OPENFILENAME 構造体 の lStructSize を調べてみました。
拡張時はバージョンアップにより構造体の末尾にメンバを追加していくようです。 いつも固定値を設定するため様式美としてあまり気にしていませんでした。
lStructSizeでサイズを指定することでメモリ例外を起こしにくいようにしているようです。 また、追加メンバーより前のメンバの位置が同じならば、古いAPIの呼び出しでは追加部分は無視扱いにでき、新しいAPIの呼び出しではlStructSizeが想定より小さい値となるため、エラーにするなり互換モードで動かすなりができるようにしているものと思われます。(うまいこと考えたものです)
Teratermのtttset構造体も何度か大きな変更をしているようですが、基本的には構造を保持し、同じように末尾にメンバを追加しています。
ただ、TeratermのV4.105においては、結果的に tttset 構造体の途中にメンバが追加された形となり、以降の位置がずれてしまうため、単純に上記のような使い方はできず、Tera Termのバージョンごとに用意が必要かなと思っていました。
前のコメントのコードでは、tttset構造体にlStructSizeのように識別子として使えるものがない(v4.105ではRunningVersionが追加されている)ため、実行プログラムのバージョンを識別子として使用し、古ければ(ここではv4.105未満)指定位置以降のアドレスを強制的に構造体のメンバ位置を調整するマクロに変えてみた次第です。