(ön not: Ben henüz tam olarak bütün 'birlikte çalışma' şeyle hız kadar değilim ...) sarılırCOM `HRESULT` NET'te bir özel durum içine
içinden bir COM kitaplığı kullanarak .NET, tüm HRESULT
yöntemleri, dönüş kodu SUCCEEDED olmadığında atılan bir şeye sarılır.
//ATL magic exluded
class C {
HRESULT foo(){ return E_FAIL; }
};
// usage code:
if(SUCCEEDED(c.foo())) {
// success code
} else {
// failure code
}
Bu kodun .NET karşılığı okur: hayır istisna işleme tabi ki
try {
c.foo();
// success code
} catch (Exception e) {
// failure code
}
doğrudan .NET COM dönüş kodu erişmek için bir yol var mı?
Sadece [PreserveSig] ', HRESULTS özel durumlara dönüştürülmüş veya istemiyorsanız, söylemek için kullanılan öznitelik olduğunu açıkça belirtmek istedim. Ayrıca, istisnaları kullanmak için genellikle * istemiş olduğunuz da not edilmelidir. HRESULTS yalnızca, tüm diller istisnaları aynı şekilde ele aldığından değil, istisnaları rapor etmek için istisnai olmayan bir mekanizmaya gereksinim duyduklarından dolayı vardır. Kendi dilinizde olduğunuzda, HRESULT (ideal olarak) dilinizin doğal istisna mekanizmasına dönüştürülmelidir. –
Bu, [PreserveSig] 'i kullanmak için tek neden bu değil. HRESULT'ın boolean olarak daha iyi veya daha kötü kullanımı için bazı COM arabirimleri vardır; Bu işlevler S_OK, S_FALSE veya bir hata değeri döndürür. Eğer '[PreserveSig]' i kullanmazsanız, S_OK ya da S_FALSE döndürüp döndürmediğini öğrenmenin bir yolu yoktur. Bu sadece S_FALSE için değil, hatasız HRESULT için de geçerli. Bunu yapan COM sınıfları neyse ki nadirdir, fakat varlar. – Sven
Ayrıca bir "HRESULT" (arabirimin geri kalanının yöntemleri gibi) döndürmeyen çok garip 'IProgressDialog.HasUserCancelled' yöntemi vardır, ancak bunun yerine bir 'BOOL' döndürür. (Hemen hemen Windows 95'de orijinal arayüzde bir hata ve uyumluluk için donmuş durumda) –