【20240204追記】
この記事で述べた方法では、問題は解決できません!(再発します)
この記事で述べている問題の正しい解決方法は、下記リンク先の記事をご参照ください。
Delphi のF9(実行)押下時に、原因がわからないエラーが発生(デバッグ出力)することに気づいた。
アプリケーションは何の問題もなく起動し、期待通りに動作、表面上はエラーも一切出ないのだけれど、水面下で「何か良くないこと」が起こってる感じ。
エラーを抱えたままの開発環境が作成した exe はさすがにヒトには配れない。なので、なんとかするべくいろいろ調べたが、なんと!情報の『欠片』すら見つからない・・・。困りに困って、頼るべき最終手段、サポートセンターに相談すると、親切丁寧なアドバイスを複数いただき、その中でDelphi自身の再インストールも状況改善のための選択肢の一つと知る。
「なるほど!」、早速実行。
再インストールは順調に終了。(再インストール時の)エラーの発生は皆無。
で、VCLアプリケーションを新規に作成し、実行(F9)すると
デバッグ出力:
clientcore\windows\advcore\ctf\shellhandwriting\client\handwritingclient.cpp(287)\Msctf.dll!77A3FC28: (caller: 77A345FD) LogHr(3) tid(988) 8007007E 指定されたモジュールが見つかりません。
Msg:[onecore\internal\sdk\inc\wil\opensource/wil/winrt.h(1686)\Msctf.dll!77A37442: (caller: 77A3F94D) Exception(1) tid(988) 8007007E 指定されたモジュールが見つかりません。
]
プロセス Project1.exe (6408)
状況は変わらず・・・。まったく同じエラーが出現・・・。
そうか・・・。原因はDelphiじゃない。
Windows なんだ・・・。
もくじ
1.handwritingclient.cppって何だ?
2.インストールメディアを作成
3.クリーン・インストール
4.登録回数の上限に達しました
5.エラーが消えた!
6.まとめ
7.お願いとお断り
1.handwritingclient.cppって何だ?
去年の今頃、僕は「手書きカタカナ文字認識機能」を自作の手書き答案採点補助プログラムに搭載できないかと考え、毎日夢中で認識率100%を実現できる学習モデル作りに取り組んでいた。
Pythonのスクリプトもたくさん書いたけど、それ以外に、いろんなアプリも試した。
もしかして、それがエラーの原因に?
embeddable Python を内部的に動かして手書きカタカナ文字をPCに認識させるため、Lobeで学習モデルを作成し、GUIはDelphiで作って自分的には(OK!)と思えるレベルを達成(できたんだけど認識率100%じゃなかったから公開はしなかった)、あの時、相当トライ&エラーを繰り返してPCをフリーズさせたり、いろんなライブラリを思い出せないくらいインストールしたりしたからなー。でも、基本的にSDカードに仕込んだWinPythonで実験したから、Cドライブには影響ないと思うんだけど・・・。
(後に読み書き速度を向上させるため、使わなくなったノートPCから取り外したSSDをMyPCに外付けして、そちらにWinPythonを入れて実験を継続。もちろん、動作速度はめちゃめちゃ速くなった!)
でも、LobeはCドライブにインストールして学習モデル作ったしなー。
もしかして、原因はコレかなー?
いずれにしても、Windowsのどこかに不具合があることは間違いない。handwritingclient.cpp がどこからやってきたC++のソースファイルなのか? さえわかれば、手の打ちようもあると思うんだけど、それも解明できない。
僕の力では、この不具合は直せない。・・・とすれば、残された方法は一つ。
リカバリーメディアを作成して、PCを工場出荷時の状態に戻す。
そう、クリーン・インストールだ。
2.インストールメディアを作成
幸いにして日付時刻は週末の早朝。急いでしなければならない仕事はない。今日の用事を強いてあげれば、バイクのエンジンを動かすこと、それから、イケナイ水を買いに行くことくらいだ。それは夕方、いっぺんにできる。
( そう言えば、このPCのリカバリー用インストールメディア、作ってなかった・・・ )
僕はずっとPanasonic製の Let’s Note を使っている。現在の使用機種は CF-QV だ。高価なマシンだけど、頑丈で壊れないし、すごく入力しやすいし、重さも動作もすこぶる軽快。あの世に持っていけるものを一つだけ選べと言われたら、僕は間違いなく、Delphi を入れた Let’s Note を選ぶ。
スタートボタン ⇨ Panasonic PCリカバリーディスク 作成ユーティリティを起動。
手近にDVD-R DL(2層)メディアが数枚あった。これを外付けドライブに挿入して、リカバリーディスクの作成を開始。
( 80分かぁ ちょっと長いなー )
1枚目のディスクのチェックの進み具合を示すプログレスバーが半分くらいまで進んだとき、予期しないエラーメッセージが・・・
『・・・メディアの作成に失敗しました・・・』
ちゃんと made in Japan って書いてあるディスク使ったのにー T_T
仕方ないから、別のディスクに入れ替えて、再チャレンジ。
ところが、またチェックの進み具合を示すプログレスバーが半分くらいまで進んだところで、
『・・・メディアの作成に失敗しました・・・』
なんでー!
さすがに三度目の正直を目指そうとは思いませんでした。
PCを乗せた机が振動した可能性(はないと思ったけど、いちおう)も考え、PCの置き場所を変更。
さらに、外付けドライブも、むかし使ってた別のちょっと古い機種に変更。
さらに、使用するメディアも DVD-R( Made in Vietnam )に変更。
今度は順調に進行。1時間半ほどかけて無事DVD-R4枚のリカバリー用ディスクが用意できた。あとは、重要なデータをバックアップして、リカバリーするだけだ。
これまでに数限りなく、データのバックアップでイタいめにあってきて、今の僕は深い階層には一切データを置かないようになった。もうトシだし、ほんとにバカだから、どこに、なにを置いたのか、すぐに忘れる・・・、メモしてあっても、そのメモの存在を忘れてしまう。だから、リンク先確認等で起動に多少時間がかかろうと、そんなのは一切無視。重要なデータは全部デスクトップにおいている。
・・・とは言っても、現在、僕にとって重要なデータは2種類しかない。一つは、Delphiで書いたプログラムのソースを保存してあるフォルダとその中のファイルたち。もう一つは、その時々で遭遇したプログラミングする上で解決しなければならなかった問題と、その解決方法を記録したNaNaTreeのファイルたちだ。これがPictureやDBなど、分野別に分類して21ファイルある。更新し続けてもう20年・・・。Delphiを続ける限り、このファイルが完成することはない。僕が死んだその日に、更新が永遠に止まるだけだ・・・。
僕は、必要に応じて、この21個のファイルを、とっかえひっかえ表示しながら、ほとんどコピペを繰り返すようなスタイルでDelphiのプログラムを書いて(?)いる。だから、この21個のファイルには、僕とDelphiのこれまでのすべてが詰まっている。そう、僕のいちばんの『たからもの』だ。
これをバックアップすればPC本体はいつでもリカバリーできる。そこで別の外付けSSDを接続して現在デスクトップにある重要なファイルとフォルダのバックアップを新規に作成。リカバリーに成功したら、SSDのバックアップからデータをPCのデスクトップに書き戻す。
以前はPythonで書いたスクリプトも保存してたけど、Pythonの方はDelphi以上にコピペの集合体だし、バックアップを探すより、Webにある情報を検索した方が便利なことに気づいたことと、何よりPythonはスクリプト本体より、そこから呼び出しているライブラリが膨大なファイルを含んでいるため、バックアップに時間と容量が必要だったり、かつ、ライブラリのフォルダ階層が深すぎてコピー時にエラーが起きたり、とにかくバックアップそれ自体が何かと面倒で、いつの間にか、僕はWinPythonを仕込んだSDカードのバックアップをとるのをやめてしまった。
3.クリーン・インストール
外付けDVDドライブにリカバリー用のディスクを入れて、PCを再起動。なんか起こるかと思ったら、普通にWindows11が起動してしまった。そうだ、BIOSの起動設定を変更するのを忘れてた!
再起動してF2を連打。BIOS画面が表示される。こちらもMy PCで拝むのは、もしかして初めてかも。外付けDVDドライブの起動を最上位に持ってきて設定を保存。再々起動。
今度は見たことのない画面が表示され、リカバリーが始まった。ひたすら1枚目のDVDディスクを読んでいるようだ。じっと見ていても仕方ないので、いずれ「2枚目のディスクを入れてください」みたいな表示が出ると見込んで、別のPCをいじって過ごす。リカバリー完了までのインターネット接続はメインで使用しているPCの前に使っていたB5サイズの Let’s Note があるので、こちらを久々に起動して必要な情報を取得する。ただ、このPC。もう長いこと、OSのアップデートを行っていない。それどころか、前回、いつ、電源をONにしたのか・・・それすら記憶にない。
( このPCもメンテナンスしなきゃ )
気がつくと、リカバリーしているPCの画面に2枚目のディスクを求めるメッセージが表示されている。2枚目を入れると、また延々とデータの読み込みが始まった。これを3枚目、4枚目と繰り返す。
4枚目のディスクを挿入後、なんだか安心して、しばらくまどろんでしまった・・・。目が覚めたら、リカバリーは無事完了。PCは工場出荷状態に戻った。昔は、ここからの設定がほんとにたいへんだったけど、今はWeb上にほとんどすべてのMy設定が記録されているので、本当にセットアップが簡単になった。何回か、IDとパスワードなどを入力してWindows11が正常に起動する状態まで戻せた。
リカバリーする前のWindows11のバージョンは 22H2 だった。前に使っていたPCでWindowsの更新情報を検索して、最新のWindows11は23H2であることを知る(2023年12月上旬現在)。どうせならWindowsも最新の状態にアップデートしたい。そう思ってWindowsの更新をいくつか入れてるうちにWindows Update に 23H2 へのアップデートのリンクが表示されるようになった。ラッキー☆
迷うことなく、23H2へのアップデートを実行。PCは無事、復活。それも最新のOSを身にまとって。
4.登録回数の上限に達しました
今回のリカバリーの最大の目的は、Delphiのデバッグ出力で表示されるエラーを解消すること。OSは無事リカバリーできたから、エラーも解消されるはず。次は Delphi 12.0 のインストールだ。
インストーラーを取得して、起動。必要事項を入力して先へ進もうとすると・・・
登録回数の上限に達しました
でたー T_T また、コレかぁ・・・ まだ 12.0 インストールした回数は新規で1回、PythonEngineの登録で実験的にインストールしなおして1回、今回のリカバリー後の再インストールで1回、合計3回だと思うんだけど・・・。
しかも日付は土曜日。サポートセンターは間違いなくお休みの日。もちろん、明日も。
( 制限を解除してもらえるのは月曜日かぁ・・・ )
とりあえず、サポートフォームを開いて、「製品登録(使用許諾)の上限更新依頼」だけしておこう。
カチャカチャ・・・
・・・というわけで、Delphiのインストールは翌週に持ち越し(持ち越され)て、その他の必要なソフトウェアを導入して週末の1日を過ごすことに。
( 今、どれくらい空き容量が残ってるんだろう? )
ふと気になって、Cドライブの空き容量を確認。なんと!驚いたことに全460GBあるうち、100GB程度しか使ってない。あと350GBも、空きが残ってる。
( 確か・・・ リカバリーする前は、残りが100GBくらいだったぞ。いったいナニが入ってたんだ? )
容量を食いつぶすデータといえば、その筆頭はもちろん動画。しかし、僕はバイク関連のごくわずかな動画しかPCに保存してない。アプリはそれなりに入れてたけど・・・250GB分もそれがあったとは到底思えない・・・。
そんなことを考えていたら、突然、デスクトップに見たことのあるフォルダが次々に『全自動で生成』されて行く現象が発生・・・。あっけにとられた感じで、しばし呆然とこれを見つめる・・・
( そうか、OneDriveのデスクトップとデフォルトで同期がONなんだ・・・ )
( 今、クラウドにあるOneDriveのデータは、いずれ、そのうちMyPCに・・・ )
( これまではOneDriveになんでも投げ込んでたから・・・ ちりも積もればナントカで・・・ )
うわー☆ 同期の設定OFFにしないと
またすぐ空き容量がなくなるー!!
慌てて画面右下の雲のアイコンを右クリックして設定を開き、同期とバックアップの「バックアップを管理」ボタンをクリックして、「このPCのフォルダーをバックアップする」の設定をすべてOFFにする。僕は、僕自身が選んだデータだけ、OneDriveに置いておきたいんだ。バックアップは自己責任で行うよ。Windowsに全部、面倒を見てもらいたくない。PCのストレージ容量が「無制限」で、OneDriveも保存容量に「制限がない」なら、全自動バックアップ大歓迎だけど・・・。
これまで気がつかなかったけど、空き容量が減ってたのは、たぶん、この設定も原因の一つだ・・・。PCをリカバリーして、今までぼんやりとしか見えてなかったものが初めて『はっきり・くっきり見えてきた』ような・・・気がする。
あとは月曜日を待って、Delphiをインストール。
F9押下時のエラーが消えれば(絶対消えるはずだけど)・・・
もっと『すっきり』するんだけどなー☆
5.エラーが消えた!
月曜日、「製品登録(使用許諾)の上限更新依頼」に対する返信があり、登録回数の上限が更新されたことを知る。Delphi 12.0 を再インストール。
Python4Delphiがない状態で確認。
新しくVCLプロジェクトを作成。保存して、F9(実行)押下。
デバッグ出力にエラーは出ない。
( やった。多分、もう、大丈夫だ )
いったん、Delphiを終了。
Delphiを再起動して、GetItパッケージマネージャからPython4Delphiをインストール。
既存のプロジェクト(マークシートリーダーのプロジェクト)を呼び出す。
F9(実行)押下。
エラーメッセージは表示されない!(P4DのインストールもOK!)
Delphiが直ったー☆☆☆
6.まとめ
エラーの根本的な原因がわからないまま、リカバリーという最も強引で、安全、確実な方法で問題を解決することになったが、目的外に実にいろんなことを経験できたリカバリー作業だった。
なぜ、DVD-R DLの書き込みに2回連続失敗したのか?
気になったので調べてみると、あちこちで同じような経験をした人がかなりいるようで、「片面2層」の DVD-9 でディスクの枚数を減らすより、ディスクの枚数は増えても、片面1層(約4.7GB)の DVD-5 を使用した方が書き込みエラーが発生する頻度は低いようだ。
メディアと機械の相性とか、いろんな問題がありそうだけれど、画質にこだわりつつ、ディスク1枚に動画を記録するのとは明らかに目的が異なる(今回のリカバリーディスク作成みたいに)単にデータが記録できればOKって場合は、片面1層のメディアを選んだ方がいい。DVD-R DLへの書き込みに失敗した本当の原因は、こちらもわからないままなんだけど、経験としてリカバリー用途のメディアには何を使ったら良いのかがとてもよくわかった。
それから、今まで「わかっているようで、実はわかっていなかった」OneDriveの使い方を本気で考えるイイきっかけにもなった。
今回のリカバリー前後で比較したCドライブの空き容量の違いに気づいたことで、自分にとっていちばん便利なOneDriveの使い方(=付き合い方)が見いだせたのはとてもラッキーだった。なんでもかんでもOneDriveに保存することは止めて、いつでも・どこでも参照したい必要最小限度のデータのみを保存し、その他の重要なデータは複数の外付けのSSDにバックアップを取る。そうすれば、僕にとって必要なSSDの容量は、150GB程度であることまで明らかにできた。今後、新しいPCの購入を考える際にも、この数字は役に立ちそう。
あと、今後、役立つことはまぁないと思うけど、Delpjiの登録回数の上限もなんとなくわかってしまった・・・。これを知るためだけにインストールとアンインストールを繰り返す人はまずいないだろうから、ある意味、これは貴重な情報と言えば言えるかもしれない。
僕はDelphiという開発環境と、Object Pascal というプログラミング言語が好きだし、その文化の存続を願うから、例えそれを高額と感じても正規の利用料を支払って、Delphiのブラッシュアップを続けてくれている Embarcadero Technologies さんの発展を支えたい。
何より、最大の目的だったDelphiのF9(実行)押下時のエラーを解消できた。これで安心してプログラムが書ける。それがいちばんうれしい。プログラムを書いていると、自分自身がよい方向に歩いているような気がしてくる。それが何よりもうれしくて、僕はプログラムを書くのかもしれない。
僕がこの世から消えた後も、それが動くことを願って。
7.お願いとお断り
このサイトの内容を利用される場合は、自己責任でお願いします。ここに記載した内容を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。