2013-02-11 16 views
6

VC++ uygulamasında C++ arabirimine sahip bir üçüncü taraf COM bileşenim var. Aşağıdaki aramada çökme yaşıyorum ki bu da başvurumu bozuyor. Uygulamamın bir parçası olmayan bu işlevden incelikle nasıl kurtulabilirim?COM hatasından nasıl kurtarılır?

Son satırda çöker. Ben üçüncü parti COM şeyler beri bu kod değiştirebilir sanmıyorum. Hangi seçeneklere sahibim? Sadece kullanıcıya mesaj kutusu getirmek ve incelikle geri dönmek istiyorum.

+1

* Emin * bu "kilitleniyor" değil, çünkü bir 'FAILED (_hr)' durumu nedeniyle atılan bir '_com_error &' yakalamıyorsunuz? Eğer hata ayıkladıysanız * neredeyse * garanti edilen hresult'unun SÜPERLİSİK bit'inin yanması garanti edilir (Sıfırlama için FAILED() 'e neden olan şey) – WhozCraig

+0

Sadece COM ile aşina değilim, yakalamam gerek catch() bloğuyla mı? – zar

+0

Evet. Genel kural, eğer bir istisna atılabilirse, ya onu yakalamanız ve idare etmeniz gerekir, ya da *** bilginizi arayan kişinin bunu yapacağını bilmenizdir. Yapılmadığı gibi geliyor. MSVC'den gelen "comutil" destek katmanı oldukça güçlüdür; neredeyse kendi başına bir metodoloji. Bunu aşağıda nasıl ele alabileceğinizi gösteren bir örnek ekledim. – WhozCraig

cevap

5

zaten kodunda bu işin yoksa, arayan-taraftan olması gerekir:

try 
{ // setup your invoke for your object... 
    IGLibMgrPtr spMgr = .... 
    bstr_t bstrPath = .... 

    // invoke your call. 
    _RecordsetPtr spRS = spMgr->GetLibInfo(bstrPath); 

    ... continue normal processing ... 
} 
catch(const _com_error& ce) 
{ 
    // handle your error here. 
} 

Bu çoklu seviyelerde önemlidir. Sadece IGLibMgr üye değil, bir istisna atar en açık olması, yani bstr_t tahsisi, vb. Bir COM DLL'den #import kodu kullanırken, MSVC comutil kitaplıktan oluşturulan akıllı-işaretçileri kullanarak, bu biçimde kullanılır.

Not: _com_error sınıf hatası neden oldu, elde HRESULT, hata açıklaması dizesini vb o şekilde-güzel verirsen, daha hatasız dönen nesne tarafından oluşturulan IErrorInfo erişim sağlar dahil olmak üzere çeşitli üyelerine Bu detay seviyesini sağlamak.

+0

Daha iyi yakalamak için const: 'catch (const _com_error & ex) {...}' – nogard

+0

@nogard egads En az bir projede en az bir proje kodunun üzerinde milyonlarca kod var. o. P = – WhozCraig