VB會將HRESULT值映射到Err.Number值。舉例來說,如果HRESULT爲0x8007002,VB打破了他們使用的COM標準如下:
Bit 31 - Severity (set to 1 in all errors)
Bit 30 - Reserved
Bit 29 - Customer Bit
Bit 28 - Reserved
Bit 27
- 16 Facility code
Bit 15
- 0 Error code
在實踐上四位總是8.基金不同,並告訴你,這是什麼類型的錯誤。在這種情況下,設施代碼是0x007(FACILITY_WIN32),這意味着這是一個標準的Win32錯誤。較低的兩個字節表示實際的錯誤。查看winerror.h,這個錯誤是2 - ERROR_FILE_NOT_FOUND。 VB非常聰明,可以將此錯誤映射到標準的VB錯誤53「文件未找到」。
在VB文檔中,我們始終鼓勵在從VB組件中提取常量vbObjectError時將它們添加到我們的錯誤編號中。這幾乎等於將32位整數0x80040000與您的錯誤號進行或運算(假設它是< = 65535)。在這種情況下,設施代碼是0x4(FACILITY_ITF),表示錯誤是由coclass的特定界面引發的。在實踐中,這只是讓我們的錯誤數字大而消極,並且很難理解。
我們應該真正做的是忽略文檔,並提高直接的錯誤數字。在幕後,VB OR'd自己的設施代碼 - 0xA(FACILITY_CONTROL)。但是,任何使用該設施代碼查看HRESULT的VB組件都會自動清除前兩個字節,因此我們會看到該數字爲正值 - 不是負值。
我建議您使用FACILITY_CONTROL作爲您自己的錯誤編號。其他COM客戶端可能會感到困惑,但VB客戶端會將您的錯誤編號視爲肯定。
或者,您可以忽略返回值的正常HRESULT機制。相反,返回HRESULT = S_OK,並在函數結尾使用[retval,out]參數使其看起來好像它是VB函數。
謝謝,使用FACILITY_CONTROL做到了! – veneff 2013-05-09 12:37:43
下面是關於如何從C#執行相同的事情(對於那些通過Google獲得)的類似答案:[通過C#的COM互操作提高正VB樣式錯誤代碼](http://stackoverflow.com/a/32868308/ 588306) – Deanna 2015-10-05 11:16:14