喫茶XRAYトップページ

[スレッド全体
]

[12882] 意地と根性で修正返信 削除
2019/5/27 (月) 17:11:10 Mr.XRAY
意地と根性で修正して更新しました.

[ locale.nls ファイルに元号の情報を追加するプログラム ]
http://mrxray.on.coocan.jp/Delphi/Others/WindowsXP_AddEraName.htm#01

> ここのリンクの記事にある「専用アプリ」てすが,分かりません.
> https://okamerin.com/nc/title/gengou_2019_winxp_howto.htm



↑ の記事の内容も気になっていました.MD5 ハッシュの値を列挙するぐらいなら,
具体的な場所と値を提示してしまえばいいのに.
ということはさておいて.

気になって長い形式を調べたら

gg y'年'M'月'


というが追加されていました.もちろん,元号追加前にはありません.
で,意地と根性で調べました.元号の数が,

> 年号の個数: オフセット: 3F8D4
> 4 → 5


というのは違うようです.私も 4 という数字に惑わされてしまいました.
何故こんなところに元号の数があるんだ ? とは思っていたことはいたのですが.
以下は,短い形式と長い形式を調べるために使用したコードです.
EXE 作成は Windows 7 U64(SP1) + Delphi XE5(UP2) Pro VCL-32 です.

  TFNDateFmtEnumProcEx = TFarProc;

  function EnumDateFormatsExW(lpDateFmtEnumProc: TFNDateFmtEnumProcEx;
    Locale: LCID; dwFlags: DWORD): BOOL; stdcall; external 'kernel32.dll';

var
  Form1: TForm1;

implementation

var
  FStrList : TStringList;

{$R *.dfm}

//------------------------------------------------------------------------------
//  EnumDateFormatsExW 関数のコールバック関数
//  日付の形式の書式文字列を列挙
//
//  引数の  CalendarID の値は以下の通り
//  [和暦] [西暦 (英語(] [西暦 (日本語)] の個別のリストを取得する場合に使用する
//
//  1:  CAL_GREGORIAN  Gregorian (localized)
//  2:  CAL_GREGORIAN_US  Gregorian (English strings always)
//  3:  CAL_JAPAN Japanese Emperor Era
//------------------------------------------------------------------------------
function EnumDateFormatsProcEx(lpDateFormatString : PChar;
  CalendarID: CALID) : integer; stdcall;
begin
  FStrList.Add(lpDateFormatString);
  Result := 1;
end;

//============================================================================
//  [地域と言語のオプション] [カスタマイズ] のダイアログを表示
//  [日付] タブの [短い形式] の選択リスト
//  ただし [和暦] [西暦 (英語(] [西暦 (日本語)] 全てのリスト
//============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  FStrList := TStringList.Create;
  try
    EnumDateFormatsExW(@EnumDateFormatsProcEx,
                       LOCALE_SYSTEM_DEFAULT,
                       DATE_SHORTDATE);
    Memo1.Lines.Text := FStrList.Text;
  finally
    FreeAndNil(FStrList);
  end;
end;

//============================================================================
//  [地域と言語のオプション] [カスタマイズ] のダイアログを表示
//  [日付] タブの [長い形式] の選択リスト
//  ただし [和暦] [西暦 (英語(] [西暦 (日本語)] 全てのリスト
//============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  FStrList := TStringList.Create;
  try
    EnumDateFormatsExW(@EnumDateFormatsProcEx,
                       LOCALE_SYSTEM_DEFAULT,
                       DATE_LONGDATE);
    Memo1.Lines.Text := FStrList.Text;
  finally
    FreeAndNil(FStrList);
  end;
end;




[12883] Re:意地と根性で修正返信 削除
2019/5/27 (月) 18:38:25 Mr.XRAY
> 意地と根性で修正して更新しました.

元号はとっくのとうに変わっているのに今更,と思っている方いるでしょう ?
その通りなんですよ.
でも,全く関心がなかったんです.
サポート期間内の Windows であれば,間違いなく Update 等があると思っていましたから.
しかし,です.
ということなのでございます.

結局,南極,放送局.
私の人生,こんなもんです.ハイ.


[12884] Re2:意地と根性で修正返信 削除
2019/5/27 (月) 20:13:03 taki
▼ Mr.XRAYさん
> > 意地と根性で修正して更新しました.
>
> 元号はとっくのとうに変わっているのに今更,と思っている方いるでしょう ?
> その通りなんですよ.
> でも,全く関心がなかったんです.
> サポート期間内の Windows であれば,間違いなく Update 等があると思っていましたから.
> しかし,です.
> ということなのでございます.
>
> 結局,南極,放送局.
> 私の人生,こんなもんです.ハイ.


マスター、お疲れ様でした。

MSからいくら位ふんだくりましょうかね。


[12885] Re3:意地と根性で修正返信 削除
2019/5/27 (月) 21:58:40 Mr.XRAY
▼ takiさん

> MSからいくら位ふんだくりましょうかね。

ハハハッ.
5 月分の出力に間に合えばいいとのことですが,
本当に和暦表示が必要なのか疑問が.
元年という表示を希望する人もいるいるぐらいですから.

今回の作業は質問のレスというより,代価を頂いてもおかしくない仕事ですね.
そういう業者がいるかどうかは別として.
(代価を頂いてしまうと公開できない可能性はありますね)

locale.nls を添付してもいいというのであれば,
Microsoft Windows インストーラにしてしまう手もありますね.
まっ,いろいろ勉強にはなりました.


[12886] Re4:意地と根性で修正返信 削除
2019/5/28 (火) 18:42:06 Mr.XRAY
> で,意地と根性で調べました.元号の数が,
>
> > 年号の個数: オフセット: 3F8D4
> > 4 → 5
>
> というのは違うようです.私も 4 という数字に惑わされてしまいました.


解析結果なんか興味ないと思いますが,折角解析したのでリストしておきます.
サイズはバイト値です,4 バイトは DWORD, 2 バイトは WORD 値ということになります.
値は元号追加前の値です.

アドレス  サイズ  値  意味
------------------------------------------------------------------
$3F8D4    4        4   元号情報開始オフセット値へのオフセット
$3F8D8    2        9   文字 3 へのオフセット値
$3F8DA    2       11   文字 99 へのオフセット値
$3F8DC    2       14   元号情報開始位置オフセット
$3F8DE    2       62   日付の形式 1 の開始オフセット
$3F8E0    2      174   日付の形式 2 の開始オフセット
$3F8E2    2      186   日付の形式 3 の開始オフセット
$3F8E4    2      334   その他の日付の形式関係情報のオフセット

で,問題の 4,つまり元号の数だと思っていたのは,ということです.
ただし,Windows XP ではこの値は使用していないようです.
実際には先頭のアドレスからのオフセットで自動処理しているようです.
この値を 10 とか 50 とかにしても結果に変化はありません.
つまり,ユーザか任意に使用していいようです.
元号の数の判定に使用してもいいということになりますです.


追記
長い形式に 「gg y'年'M'月'」というのが挿入されてしまったのは,
この元号の数の設定のせいではありません.
私か,オフセットの解釈を間違えて,処理をサボったためです.


[12887] バイナリエディタでの編集がお好き ?返信 削除
2019/5/29 (水) 14:38:15 Mr.XRAY
バイナリエディタを使用して直接編集したい方もいるようですので.以下を追加

[ バイナリエディタで locale.nls に元号の情報を追加する手順 ]

追記
やっぱりどう考えても不要,と思い,↑ は削除しました.


[12896] Re5:意地と根性で修正返信 削除
2019/6/2 (日) 11:05:01 Mr.XRAY
> で,問題の 4,つまり元号の数だと思っていたのは,ということです.
> ただし,Windows XP ではこの値は使用していないようです.
> 実際には先頭のアドレスからのオフセットで自動処理しているようです.
> この値を 10 とか 50 とかにしても結果に変化はありません.


テーブル番号のようです.変更しない方がいいかも.
この記事の解析結果から判断すると,この 4 からのデータをレコード型にすべきかも.

参考記事
http://blog.livedoor.jp/blackwingcat/archives/1980913.html


# Windows 2000 です.探してみるもんです.


[12899] Re6:意地と根性で修正返信 削除
2019/6/3 (月) 19:35:51 Mr.XRAY
> この記事の解析結果から判断すると,この 4 からのデータをレコード型にすべきかも.

てなわけで,レコード型の定義を変更しました.
実行結果への影響はありません.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82