HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0827
zezenanaHSP3.6 (安定版) のmrefの動作について5解決


zezenana

リンク

2021/8/27(Fri) 22:21:48|NO.93708

HSP3.6 (安定版) をインストールして
HSP3.51で動作していたソースを実行したところ
応答なしとなってしまい、原因を調べたところmref命令の
変数割当がおかしな状態であることがわかりました。

自分の環境だけの問題なのか不明なので
どなたかHSP3.6 (安定版) の環境で以下のサンプルを
確認していただけませんでしょうか?

※Let's HSP!さんのHPサンプルを借用


mref BMSCR, 67 mes "高さ : "+BMSCR.49 mes "太さ : "+BMSCR.53 mes "イタリック体 : "+peek(BMSCR.54, 0) mes "下線 : "+peek(BMSCR.54, 1) mes "打ち消し線 : "+peek(BMSCR.54, 2) mes "出力品質 : "+peek(BMSCR.55, 2) sdim lfFaceName getstr lfFaceName, BMSCR, $E0 mes "フォント名 : "+lfFaceName

通常は現在のフォント情報を返すのですが

HSP3.6 (安定版) だと、高さ:8051896、太さ:259、
フォント名が文字化けなどとなり(異常なデータ)

HSP3.6β5やHSP3.51だと、高さ:-14、太さ:400、
フォント名:FixedSysとなります(正常なデータ)



この記事に返信する


TOMATO

リンク

2021/8/27(Fri) 23:05:24|NO.93710

HSP 3.6 にて BMSCR構造体に変更が加わった模様です。
構造体内のlogfontメンバがポインタに変更されています。

http://dev.onionsoft.net/trac/openhsp/browser/trunk/hsp3/win32gui/hspwnd_win.h#L410

HSP 3.6(通常ランタイム版) で実行する場合は、以下のように修正する必要があります。


mref BMSCR, 67 dupptr logfont, BMSCR.49, 56, 4 mes "高さ : "+logfont.0 mes "太さ : "+logfont.4 mes "イタリック体 : "+peek(logfont.5, 0) mes "下線 : "+peek(logfont.5, 1) mes "打ち消し線 : "+peek(logfont.5, 2) mes "出力品質 : "+peek(logfont.6, 2) sdim lfFaceName getstr lfFaceName, logfont, 28 mes "フォント名 : "+lfFaceName



zezenana

リンク

2021/8/29(Sun) 14:23:06|NO.93721

TOMATOさん

BMSCR構造体が変更されている情報ありがとうございます。
フォント情報が正常に取得出来ることを確認しました。

history.txtに記載されていた3.6RC1での不具合修正のようで
[hsp3utf]とはUnicode版対応の処理かなんかですかね?

>2021/07/15 3.6 RC1
>[hsp3utf] プラグインに渡されるBMSCR構造体のサイズが一部ずれていた不具合を修正

しかしこれだとHSP3.5以下のフォント描画関連プログラムの
互換性がなくなるようなので、他スレでもおにたまさんに質問してみます。

確認なのですが、BMSCR構造体の変更を見る限りだと、
LOGFONTは60バイトだと思うのですが、修正プログラムで
56バイト取得しているのは何か問題があるからでしょうか?

(変更前)

LOGFONT logfont; // logical font



(変更後)

LOGFONT *logfont; // logical font int logopt[14]; // dummy padding



TOMATO

リンク

2021/8/29(Sun) 14:57:27|NO.93723

> 56バイト取得しているのは何か問題があるからでしょうか?

すいません、
構造体のサイズの数え間違えですのでご指摘の通り60バイトが正しいです。



TOMATO

リンク

2021/8/29(Sun) 15:06:48|NO.93724

> history.txtに記載されていた3.6RC1での不具合修正のようで
> [hsp3utf]とはUnicode版対応の処理かなんかですかね?

LOGFONT構造体は文字コードで構造体サイズが変動するので、
従来の60バイトに収まらなかったので、ポインタ経由にしたのではと推察します。

HSP 標準ランタイム 32bit --> 60バイト
HSP UTF8版ランタイム --> 92バイト (内部的にはUTF-16)


(余談)

と、書いていて気が付きましたが、
64ビット版ランタイムだとポインタが4バイトから8バイトになるので、
こちらもずれてる… 64バイトになってる気が。


LOGFONT *logfont; // logical font int logopt[14]; // dummy padding



zezenana

リンク

2021/8/29(Sun) 16:25:03|NO.93725

TOMATOさん

LOGFONT構造体バイト数について了解しました。

>LOGFONT構造体は文字コードで構造体サイズが変動するので、
>従来の60バイトに収まらなかったので、ポインタ経由にしたのではと推察します。
>
>HSP 標準ランタイム 32bit --> 60バイト
>HSP UTF8版ランタイム --> 92バイト (内部的にはUTF-16)

TOMATOさんの上記説明でポインタに変更した理由について納得しました。

今後Unicode版が主流となることを考えるとHSP3.5以前の互換性とか
わざわざ他スレで聞く必要は無さそうですね。
(まあ構造体のアドレス直打ちのスクリプト組んでる時点で
互換性とかの話でもないですし・・)

ありがとうございました。


試しに、64bit版を試しましたが
何も処理せずきれいに落ちました。。まあ注意書きの通りということでしょうか。

>同梱されているバージョンには、将来の64bit化に向けてのβテスト版とお考えください。



ONION software Copyright 1997-2023(c) All rights reserved.