トップ回答者
NotifyIpInterfaceChange によるコールバック通知直後にAccess violation が発生する

質問
-
Windows 7 の環境で、ネットワークインタフェースの状態変化を検出するために NotifyIpInterfaceChange を使用してみましたが、状態変化検出直後に Access violation が発生します。ソースコードには問題内容に思えますが、不備などあればご指摘ください
下記コードで、インタフェース状態の変化通知のコールバックが呼び出され、コールバック関数終了後にAccess violation が発生します。
::NotifyIpInterfaceChange( AF_UNSPEC , (PIPINTERFACE_CHANGE_CALLBACK)InterfaceChangeCallback , this , TRUE, &NotifyHandle ) ;
VOID CNetworkStatusChange::InterfaceChangeCallback( IN PVOID CallerContext , IN PMIB_IPINTERFACE_ROW Row OPTIONAL , IN MIB_NOTIFICATION_TYPE NotificationType )
{
if( NotificationType != MibInitialNotification )
::SetEvent( CNetworkStatusChange::getInstance().m_hNotifyEvent ) ;
}
回答
すべての返信
-
::SetEvent( CNetworkStatusChange::getInstance().m_hNotifyEvent ) ;
この部分が少し引っかかります。セオリーから行けば
::SetEvent( CNetworkStatusChange::getInstance()->m_hNotifyEvent ) ;
だと思うのですが、上記のコードは転載する時にすり替わったとかしたのでしょうか?(getInstance() の後ろは、「.(ピリオド)」なくて「->」とするのが通例)
この部分が転載漏れだったとして、getInstance() が返すインスタンスが正しいものなのかどうかが気になりますね。
getInstance() の実装内容だとか、コールバック時にもインスタンスがちゃんと存在しているかとかは、大丈夫でしょうか?
ちなみに、SetEvent を外すと動きはどうなるでしょうか? -
セオリーから行けば
::SetEvent( CNetworkStatusChange::getInstance()->m_hNotifyEvent ) ;
だと思うのですが、上記のコードは転載する時にすり替わったとかしたのでしょうか?(getInstance() の後ろは、「.(ピリオド)」なくて「->」とするのが通例)
-> 演算子でなければならない理由は何でしょうか?(ミス予防などでしょうか?)
T& getInstance(); なら、. 演算子でも問題ないと思います。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。 -