Windows 7 で C++ 関数で WscRegisterForChanges を使用しようとしています。
ドキュメントは次の場所にあります。
http://msdn.microsoft.com/en-us/library/bb432507(v=VS.85).aspx
私の問題は、コールバックが適切に実行されても、コードがコールバックの実行の最後に到達するとクラッシュすることです。
これが問題のコードです。非常に単純なので、クラッシュする理由がわかりません。
#含む #含む #含む void SecurityCenterChangeOccurred(void *param) { printf("変更が発生しました!\n"); } int main() { HRESULT 結果 = S_OK; ハンドル callbackRegistration = NULL; 結果 = WscRegisterForChanges( ヌル、 &callback登録、 (LPTHREAD_START_ROUTINE)SecurityCenterChangeOccurred, ヌル); ながら(1) { スリープ(100); } 0 を返します。 }
クラッシュが発生すると、コール スタックは次のようになります。
> 00faf6e8() ntdll.dll!_TppWorkerThread@4() + 0x1293 バイト kernel32.dll!@BaseThreadInitThunk@12() + 0x12 バイト ntdll.dll!___RtlUserThreadStart@8() + 0x27 バイト ntdll.dll!__RtlUserThreadStart@8() + 0x1b バイト
ExitThread(0); を追加すると、SecurityCenterChangeOccurred の最後まで、エラーと次のトレースが表示されます (したがって、ExitThread を使用する必要はないと思います)。
WscRegisterForChangesCrash.exe の 0x7799852b (ntdll.dll) で未処理の例外: 0xC000071C: 無効なスレッド、ハンドル %p がこの操作に指定されています。おそらく、スレッドプール ワーカー スレッドが指定されました。 ntdll.dll!_TpCheckTerminateWorker@4() + 0x3ca2f バイト ntdll.dll!_RtlExitUserThread@4() + 0x30 バイト > WscRegisterForChangesCrash.exe!SecurityCenterChangeOccurred(void * param=0x00000000) 8 行目 + 0xa バイト C++ wscapi.dll!WorkItemWrapper() + 0x19 バイト ntdll.dll!_RtlpTpWorkCallback@8() + 0xdf バイト ntdll.dll!_TppWorkerThread@4() + 0x1293 バイト kernel32.dll!@BaseThreadInitThunk@12() + 0x12 バイト ntdll.dll!___RtlUserThreadStart@8() + 0x27 バイト ntdll.dll!__RtlUserThreadStart@8() + 0x1b バイト
なぜこれが起こっているのか、誰にも考えがありますか?
クラッシュをトリガーするには、プログラムを実行し、ファイアウォールをオンまたはオフにします。