2010-12-06 14 views
5

Bir ATL projesi yazıyorum ve buradaki dersleri nasıl oluşturmalıyım? Şu anda Add/Class/ATL Basit Nesne tarafından oluşturulmuş bir sınıf var. Bunu daha küçük sınıflara bölmek istiyorum, ancak bu sınıftaki yöntem CComPtr kullanmalı ve bir argüman olarak CComPtr olmalıdır. Orada 'basit' C++ sınıfı oluşturamıyorum çünkü orada CComPtr yok.ATL projesinde sınıfları nasıl oluşturmalıyım?

ATL Basit Nesne Sihirbazı ile ATL sınıfları oluşturmalı ve sonra yöntemleri çağırmak için bu sınıfın arabirimini kullanmalıyım.

CComPtr<ITestAtlClass> tptr; 
tptr.CoCreateInstance(CLSID_TestAtlClass); 
tptr->test(); 

Ve/Yöntem Ekleyin Sınıf Görünümü/ITestAtlClass/bütün kamu yöntemleri eklemek gerekir: Burada gibi mi? Kurucular hakkında ne düşünüyorsunuz? Sınıfımı yalnızca özelliklerine göre başlatmalı mıyım (ve bunları Sınıf Görünümü/ITestAtlClass/Ekle/Özellik Ekle)? Ve her com nesnesini IUnknown arayüzüyle geçirir misiniz?

Birisi bana ATL projesinde nasıl yapılması gerektiğini söyler. Kodumu daha okunabilir hale getirmek için bu daha küçük sınıfları dahili olarak kullanacağım (hiç kimse bu listemi DLL'm dışında oluşturacaktır).

+2

Sadece DLL dışında görünen arabirimler için ATL sınıfları oluşturun. –

+0

@Hans Passant Ancak, CComPtr'yi kullanan basit C++ sınıfı oluşturamıyorum. Nasıl kullanılır? –

cevap

8

Yorumunuzu, basit bir C++ sınıfından CComPtr kullanamayacağınızı anlamıyorum. Lütfen açıklar mısın?

iki strateji bkz:

  • yapı sorunu çözer temiz bir C++ nesne modeli ve ardından bir veya daha fazla COM boyunca
  • Kullanım ATL sınıfları nesneleri ince bir cephe tabakasında sarıp, CoCreateInstance no'lu ek yükü ve sadece halka açık arayüzleri kullanmanın sınırlamalarını yerine getirmek için CComObject<> ve türevlerini kullanın.

Bunlardan ilki genellikle çok daha güzel, ancak bir veri-ağır nesne modeli oluşturuyorsanız, ikinci yararlı bir teknik olabilir.

CVehicle adında bir ATL COM sınıfınız varsa, bu CComObjectRootEx<> ve arkadaşlarından türetilir;

Ayrıca, CComObject<>, örn. Farklı tahsis ve referans sayma stratejileri kullanan CComObjectStack<>. Gördüğünüz gibi bu oldukça dağınıktır. CComPtr'u kullanamadığınızı söyleyerek yorumunuzdan ne kastettiğinizi açıklayabilirseniz, belki bunu genişletebilirim.

+0

Çok teşekkür ederim! Bu ATL sınıflarını nasıl kullanacağımı anlamıyorum. Şimdi bana bu örneği gösterdiğinizde [MSDN] 'de aynı şeyi buldum (http://msdn.microsoft.com/en-us/library/9e31say1.aspx). 'CComObject araç; vehicle.someMethod() 'O zaman hafızayı bırakmak için endişelenmem gerekmeyecek mi? Veya böyle bir şey yazabilir miyim: 'CComPtr >; CComObject :: CreateInstance (& araç); 'Ve o, gereksiz olduğunda kendisini serbest bırakacak mı? –

+0

CComPtr kullanamayacağımı söylediğimde ALT nesnesi oluşturmayı bilmiyordum ... Normal C++ sınıfına atlcomcli.h ve atlcom.h ifadelerini dahil etmeyi denedim (ATL Basit Nesne Sihirbazı olmadan derecelendirildi). Biraz utanıyorum ama bu ATL kaynakları çok iyi değil. –

+0

Yığında nesneler oluşturmak için, gösterdiğiniz gibi, 'CComObjectStack <> 'komutunu kullanırsınız. CComObjectStack'ın bir üye değişkeni olarak başka bir sınıfa gömülebileceğinden emin değilim, diğer CComObject varyasyonlarını okumak isteyebilirsiniz. –