そこで、Windows でディレクトリを再帰的にスキャンする基本的なプログラムで、char と wide char をいじってみました。最初は、標準の文字と文字列、およびこのタスクを実行するための関連関数 (FindFirstFile、FindNextFile など) を使用していました。実際の再帰は、CreateThread と WaitForSingleObject を介して作成されたスレッドに渡されます。これは完全に正常に機能し、期待どおりに機能しました。
ただし、これらの文字、文字列、および関連する関数を対応する広い対応する関数 (wchar_t、wstring、FindFirstFileW など) に変換すると、問題が発生しました。現在、プログラムは、少数以上のフォルダーを持つディレクトリを再帰的にスキャンするときに例外をスローしています/ファイル。例外は、スレッド処理の WaitForSingleObject フェーズで発生しています。例外自体に関する次の情報を追跡しました。
EAccessViolationは、無効なメモリ アクセス エラーの例外クラスです。
EAccessViolation は、アプリケーションが次の場合に発生します。
nil (Delphi) または NULL (C++) ポインタを逆参照します。
実行可能コード用に予約されたメモリに書き込みます。
アプリケーションに仮想メモリが割り当てられていないメモリ アドレスにアクセスしようとします。
ランタイム例外情報は、EExternal によって提供されるフィールドに保存されます。
注: アプリケーションは EAccessViolation を直接発生させるべきではありませんが、代わりにランタイムに依存してこの例外を発生させる必要があります。
私の質問は、私が変更したのは使用されている文字の種類だけであるのに、一体なぜこの例外がスローされるのでしょうか? 私が使用している IDE は RAD Studio XE3 C++Builder ですが、残念ながら、コードを大幅に変更しない限り、他の IDE でこれを実際にテストすることはできません。