Windows Embedded Compact 7 (別名 Windows Embedded CE 7) サービスを開発しています。Boost.Logライブラリはログ記録に使用され、場合によってはBoost Thread ライブラリが使用されます。xxx_IOControlサービス メソッドからログ エントリを追加しようとすると、クラッシュします。
調査の結果、クラッシュの理由は、thread.cpp ブースト スレッド ソース ファイルの add_thread_exit_function で NULL ポインターを逆参照していることがわかりました。NULL ポインター自体の最初の理由は、TlsGetValue/TlsSetValue Windows API 関数の不適切な動作である可能性があります。具体的には、次のコードで:
BOOL setOk = TlsSetValue(tlsKey, originalData);
LPVOID returnedData = TlsGetValue(tlsKey);
xxx_IOControl 呼び出し内で呼び出された場合、returnedData は NULL ですが、originalData は NULL ではありません。setOk が TRUE で、両方の TlsXXX 関数が ERROR_SUCCESS を返した後に GetLastError() が呼び出されています。同じコードがxxx_Init呼び出し内で呼び出されている間、returnedData は originalData 値と正しく等しく返されます。両方の呼び出し (xxx_Init と xxx_IOControl) で同じ tlsKey が使用され、それらの間にTlsFree呼び出しはありません。
また、おそらく関連している事実がもう 1 つあります。サービスDLLとboost_thread.dllの両方で、xxx_IOControlを呼び出すスレッドに対してDllMain(DLL_THREAD_ATTACH)が呼び出されません。
Windows CE サービス用の特別なスレッド機構はありますか? 誰かに役立つ関連情報はありますか?