HResultの値

Category: visual studio vb_ja

Question

Luky9 on Wed, 10 Jul 2019 02:21:13


UnauthorizedAccessException例外発生した時にHResultが-2147024891値でした。
http://ir9.jp/prog/ayu/win32err.htmのERROR_ACCESS_DENIEDで値5ですが
この二つをどうやって比較できますでしょうか。
ex.HResult値を何か変換して5で比較できるみたいですが私はできない状況です。

Luky9

Replies

佐祐理 on Wed, 10 Jul 2019 02:48:33


Windows SDKのwinerror.hには

#define __HRESULT_FROM_WIN32(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))

のように定義されています。実際、-2147024891は16進表記で0x80070005であり、ERROR_ACCESS_DENIED(5)を表していることがわかります。Visual Basicでも同様に変換すればいいかと。

Luky9 on Wed, 10 Jul 2019 02:58:10


ご返信ありがとうございます。

Catch ex As UnauthorizedAccessException When CInt((ex.HResult And &HFFFF)) = 5 で解説できました。

Azulean on Wed, 10 Jul 2019 03:16:12


この質問は HRESULT の成り立ちを知りたかったということで合っていますか?そうであれば、特に問題ないと思います。

もし、実際のコードでこのように書こうとされている場合はちょっともやっとするので...。

この例外クラスは HRESULT 固定 であるので違う値のことはほぼなく、when を書いても意味がなさそうに見えるため。

https://referencesource.microsoft.com/#mscorlib/system/unauthorizedaccessexception.cs,94e3cb4b7b7d78be