Skip to content

Latest commit

 

History

History
170 lines (115 loc) · 7.36 KB

2022-09-18.md

File metadata and controls

170 lines (115 loc) · 7.36 KB

2022-09-18

私が何かを間違えているのか、configure VSSolutionをしても生成されるoutput-VS-i38-slnにhttp://build.ninjaがないようです その代わり、slnが生成されるのでそれを用いてVS 2019でビルド成功を確認しました

と思いましたが、ビルド成功すら怪しそうです。 VBoxで起動をテストした際、インストールメディアを用いてインストールする際のキー入力時にハングしました ビルド成功が怪しそうな根拠としてbootcd.isoのサイズがあまりにも小さいことを根拠にしています とりあえずいろいろ原因を探しつつ試してみます

build.ninja がないのは、こっちの間違いかもしれませんね。 VSではソリューション全体をビルドしていますか?

こちらの間違いでした。ソリューションを使ってビルドして下さい。

こんにちは!

こんにちはー

今日は雨が強いです じめじめ

九州は雨がひどくなっています。手引きが間違ってお手数を掛けてすみませんでした。手引きを修正しました。

いえいえ 大丈夫ですよ

良いニュースが2件あります。

ログオン時のキーボードレイアウトの読み込み:

https://github.com/reactos/reactos/commit/8e110335e706a267cae1d691a6ac774add6ad931

これと、input.dllの修正:

https://github.com/reactos/reactos/commit/596f04be6b1710bb255b346bc9bc7153c7d6eb0c

により、input.dllの設定が正しく読み書きされるようになりました。

rapps-dbへのmzimejaの追加:

https://github.com/reactos/rapps-db/commit/f2e4ca0b8082a8ed7091b9a7010662f7dc097314

この変更により、rappsでmzimejaがインストールできるようになりました。

さて、ReactOSでWinDBGは使えるようになりましたか?

こっちはまだまだです どうやらoutput-i386-slnの中 hal/halx86/pci_vendors.cで問題が発生しているようです

エラーメッセージは?

VSは閉じてしまったので後で上げます

また、VS2019なのが原因の可能性を考えて2017でも試してみる予定です

わかりました。

さて、IMEの理解のために、katahiromz/mzimeja を読み進めていこう。

最新の mzimeja 0.9.1 を見ていく。

https://github.com/katahiromz/mzimeja

CMakeLists.txtの下の方。

add_definitions(-DUNICODE=1 -D_UNICODE=1)

これはUnicodeサポートのためのマクロ。これにより、API関数のA/Wが切り替わる。

option(MZIMEJA_DEBUG_OUTPUT "Enable debug output" OFF)
if(MZIMEJA_DEBUG_OUTPUT)
    add_definitions(-DMZIMEJA_DEBUG_OUTPUT)
endif()

これはデバッグ出力を有効にするためのオプション。デフォルトではOFF。

add_subdirectory(ime)
add_subdirectory(imepad)
add_subdirectory(setup)
add_subdirectory(verinfo)
add_subdirectory(dict_compile)

サブディレクトリのimeは、生のIMEファイル。 サブディレクトリのimepadは、漢字の入力を助けるプログラム。 サブディレクトリのsetupは、IMEインストールを助けるプログラム。これはinstallerから自動的に呼ばれる。 サブディレクトリのverinfoは、バージョン情報を表示するだけのプログラム。 サブディレクトリのdict_compileは、辞書をコンパイルするためのプログラム。

add_custom_target(make_dict COMMAND cmd /C make_dict.bat
    DEPENDS res/mzimeja.dat res/name.dat)
add_dependencies(make_dict dict_compile)

make_dictは、実際に辞書データをコンパイルするカスタムターゲット。

このmzimejaはそのままのRosBEではビルドできない(ソースにShift_JISを使っているので変換が必要)。 XP/ReactOSで動作可能にするには日本語Visual StudioのXPツールセットを使ってビルドしないといけない。 詳しくはHowToBuild.txtを見て下さい。

ファイルinstaller.iss。これはInno Setup用のインストーラの設定ファイルである。 XP/ReactOSで動作可能にするには、古いInno Setup (5.6.1 (u))を使わないといけない。 installerd.issは、デバッグ用。

setupを見てみよう。wWinMainから。コマンドライン引数がなければダイアログ1を表示する。 コマンドライン引数があれば、インストールまたはアンインストールする。

setupのDoInstall()関数。

  1. DoSetRegistry1関数でキーボードレイアウトのレジストリ情報を書き込んでいる。
  2. DoSetRegistry2関数でこのアプリのインストール情報を書き込んでいる(主にパス設定)。
  3. DoCopyFiles関数でファイルをシステムにコピーしている。
  4. ImmInstallIME関数で実際にIMEをインストールする。
  5. ShellExecuteW関数でコマンドライン「control input.dll」を実行する。

setupのDoUninstall()関数。

  1. DoDeleteFiles関数でシステムにインストールしたファイルを削除。
  2. DoUnsetRegistry1関数とDoUnsetRegistry2関数でレジストリ情報を削除。

次は、mzimeja.h。DebugPrintA/W関数でデバッグ出力を宣言している。DebugPrintA/Wはime/main.cppで定義されている。 どうやらこの関数はデバッグ出力有効時にデスクトップのファイル「mzimeja.log」に追加書き込みしているようだ。

そして、footmark.hpp。これは足跡ということかな。DebugPrintA/WとFootmarkLocationクラスにより、 呼び出し履歴のようなものを実現している。 一般にIMEはそのままではデバッグは困難であるから、このような仕組みの助けが必要となる。

それから、imeを見てみよう。imeのCMakeLists.txt。 add_library(ime SHARED ...) でDLLファイルを作成。 プロパティOUTPUT_NAMEは"mzimeja.ime"。 DEFファイルmzimeja.defでDLLでエクスポートする関数を指定している。 IMEファイルは、実質的に拡張子が違うだけのDLLファイルである。

ime/main.cppのDllMain関数。DLL_PROCESS_ATTACHでMzIme::Initを呼ぶ。 これで辞書が読み込まれて必要なウィンドウクラスが登録される。

// the window classes for mzimeja UI windows
const WCHAR szUIServerClassName[] = L"MZIMEUI";
const WCHAR szCompStrClassName[]  = L"MZIMECompStr";
const WCHAR szCandClassName[]     = L"MZIMECand";
const WCHAR szStatusClassName[]   = L"MZIMEStatus";
const WCHAR szGuideClassName[]    = L"MZIMEGuide";

これらは、mzimejaで使われているIME UIウィンドウクラス群。 これらはMzIme::RegisterClasses関数で登録される。

UI serverというのは、IME UI全体を統括するサーバーとしてのUI ウィンドウである。 comp strというのは、Composition Stringの略で、変換中の文字列とそれを表示するUI ウィンドウである。 candは、Candidatesの略で、変換候補とそれを表示するUI ウィンドウである。 statusは、状態を表示するUI ウィンドウである。 guideは、IMEのセッティングに失敗したときの対話に使われるUI ウィンドウである。

【課題】日本語XPと日本語ReactOSにおいてmzimeja 0.9.1のデバッグ出力を取得・比較し、おかしな点を発見せよ。

今日はここまで。

了解です


戻る | 次へ