0

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 バイト

なぜこれが起こっているのか、誰にも考えがありますか?

クラッシュをトリガーするには、プログラムを実行し、ファイアウォールをオンまたはオフにします。

4

2 に答える 2

2

これは呼び出し規約によるものです。WinApi32関数の定義|コールバックは、マクロWINAPIまたはCALLBACKの前に置く必要があります。これは基本的に、呼び出し規則についてコンパイラに伝えます-スタックにプッシュされるパラメーターの順序、戻り値、呼び出し元に戻った後のスタックの復元を書き込む必要があります。

要約すると、CC は呼び出し元と呼び出し先の間の関係を定義しました

于 2011-12-14T14:02:59.430 に答える
0

コールバックに WINAPI を追加すると、これが修正されるようです。

新しい呼び出しは次のようになります。

void WINAPI SecurityCenterChangeOccurred(void *param) {
    printf("変更が発生しました!\n");
}

なぜこれが必要なのか誰か教えてもらえますか?

于 2010-05-07T06:23:21.023 に答える