2011-06-16 26 views
5

(ö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ı?

cevap

4

Evet, ancak birlikte çalışma arabirimini (tlbimp.exe'yi kullanmak yerine) el ile tanımlamanız ve söz konusu yöntemlere ilişkin PreserveSig özniteliğini kullanmanız gerekir. Örneğin

: Arabiriminizin çok karmaşık ya da birlikte çalışma arayüzünü nasıl tanımlanacağı sayfası takılırsa HRESULT DoSomething([out, retval] int *result);

, ben tavsiye imzası ile bir COM yönteminin eşdeğerdir

[ComImport] 
[Guid("your-guid-here")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
interface IMyComInterface 
{ 
    [PreserveSig] 
    int DoSomething(out int result); 
} 

tlbimp.exe'yi kullanarak Reflektör veya ILSpy'yi veya oluşturulan arabirimleri deşifre etmek için benzer bir şeyi kullanın ve sonra bunları istediğiniz gibi düzenleyin. İşi de kaydeder. :)

+0

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. –

+1

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

+0

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) –

İlgili konular