(つづきました)
InterlockedExchange 関数は公式の説明からしてすでに怪しい感じなのですが、
第一引数 *Target へ Value を設定する、みたいな説明になってますけども。
Exchange ですよ? 交換って意味ですからね?
実際に WinDbg で見ると xchg 命令使ってますしw
Value はぶっ壊してますよこの関数。
しかも Value は関数へのポインタなんで、値をぶち込んだらそりゃ怒られますよねえw
というか関数ポインタを InterlockedExchange() を使って設定しようなんていう
コードがそもそも間違いなのかも。
実は、InterlockedExchangePointer() が InterlockedExchange() を使っていまして。「Exchange」と名前についている時点で怪しさプンプンなので気づくべきでしたね。
そんな感じですかね。
CLR でメモリアクセス違反になってる、このコードは無茶しすぎです。