2012-05-06 24 views
5

DirectShow'u kullanacak küçük bir kitaplık yazmaya çalışıyorum. Bu kütüphane bir .NET uygulaması tarafından kullanılmalıdır, bu yüzden C++/CLI'ye yazmanın en iyi olacağını düşündüm.C++/CLI'de bir referans sınıfındaki 'yerel' işaretçiyi nasıl kullanabilirim?

HRESULT hr = CoCreateInstance( CLSID_FilterGraph, 
            NULL, 
            CLSCTX_INPROC_SERVER, 
            IID_IGraphBuilder, 
            (void**)(&graphBuilder)); //error C2440: 

graphBuilder ilan edilir:

Ben ancak bu hat ile sorun yaşıyorum Ben doğru this page anlama am mı

public ref class VideoPlayer 
{ 
public: 
    VideoPlayer(); 
    void Load(String^ filename); 

    IGraphBuilder* graphBuilder; 

}; 

, ben göstermek için her zamanki gibi */& kullanabilirsiniz 'yerli' C++/CLI kitaplığımdaki yönetilmeyen belleğe işaretçiler; Yönetilen bir nesneye işaretçiyi göstermek için ^ kullanılır. Ancak bu kod üretir:

hata C2440: 'türü dökme':

hata graphBuilder olarak kabul edilir olduğunu göstermektedir 'hükümsüz **' için 'cli :: interior_ptr' dan dönüştüremezsiniz 'cli::interior_ptr<Type>'. Bu, yönetilen belleğin bir göstergesi/tanıtıcısı değil mi? Ama bu saf bir yerli işaretçidir. İşaretçiyi bir tanıtıcıya ya da tam tersi bir yönteme iletmeye çalışmıyorum - sadece bunu yönetilen sınıfımda saklamak istiyorum) Eğer öyleyse, graphBuilder 'geleneksel' işaretçiyi nasıl söyleyebilirim?

(This question benzerdir ama benim sınıfın üyesi olamaz gibi cevap bir pin_ptr kullanmak, ben, bana yardım görmüyorum)

cevap

9

hata mesajı biraz şifreli ama derleyici olduğunu Yönetilen bir sınıfın bir üyesine yönetilmeyen bir koda bir işaretçi gösteremeyeceğinizi hatırlatmaya çalışmak. Bu, işlev çalışırken ve yönetilen nesneyi yürütürken çöp toplayıcısı devreye girdiğinde tasarım, felaket saldırıları ile işe yaramaz. İşaretçiyi işlemdeki üyeye geçersiz kılma ve yerel kodun baytları yanlış adreste gc yığınına püskürtmesine neden olur.

Çözüm basittir, sadece bir yerel değişken bildirin ve bunun yerine bir işaretçi iletin. Yığındaki değişkenler taşınamaz. Bunun gibi:

void init() { 
    IGraphBuilder* builder; // Local variable, okay to pass its address 
    HRESULT hr = CoCreateInstance(CLSID_FilterGraph, 
     NULL, 
     CLSCTX_INPROC_SERVER, 
     IID_IGraphBuilder, 
     (void**)(&builder)); 
    if (SUCCEEDED(hr)) { 
     graphBuilder = builder; 
     // etc... 
    } 
} 
+0

İşaretçi, ayarlanmışken hareket edebilir - bunu tamamen özledim! Teşekkür ederim Hans! – sebf

+0

Yani, sadece açık olmak gerekirse, yönetilmeyen bir işaretçiyi yönetilen bir sınıfın dahili üyesi olarak bile tutamayacağınızı söylüyorsunuz? Kafamı, bu doğruysa, herhangi bir tutarlı şekilde yönetilen ve yönetilmeyen türler arasında nasıl köprü kurmam gerektiği üzerine sarmayı denedim .. –

+0

Hayır, sorun değil. OP, nesnenin bir üyesi ve graphBuilder için bir işaretçi oluşturdu. –

İlgili konular