COM ve .NET için C++ öznitelikleri

Microsoft, COM programlamayı ve .NET Framework ortak dil çalışma zamanı geliştirmeyi basitleştiren bir dizi C++ özniteliği tanımlar. Kaynak dosyalarınıza öznitelikler eklediğinizde, derleyici oluşturulan nesne dosyalarına kod eklemek veya kodu değiştirmek için sağlayıcı DLL'leriyle birlikte çalışır. Bu öznitelikler .idl dosyalarının, arabirimlerinin, tür kitaplıklarının ve diğer COM öğelerinin oluşturulmasına yardımcı olabilir. Tümleşik geliştirme ortamında (IDE), öznitelikler sihirbazlar ve Özellikler penceresi tarafından desteklenir.

Öznitelikler, COM nesnelerini yazmak için gereken ayrıntılı kodlamalardan bazılarını ortadan kaldırsa da, bunları en iyi şekilde kullanmak için COM temelleri'nde bir arka plana ihtiyacınız vardır.

Dekont

C++ standart öznitelikleri arıyorsanız bkz . Öznitelikler.

Özniteliklerin Amacı

Öznitelikler, dilin klasik yapısını bozmadan C++'ı şu anda mümkün olmayan yönlerde genişletir. Öznitelikler, sağlayıcıların (ayrı DLL'ler) dil işlevselliğini dinamik olarak genişletmesine olanak sağlar. Özniteliklerin birincil hedefi, bileşen geliştiricisinin üretkenlik düzeyini artırmanın yanı sıra COM bileşenlerinin yazılması sürecini basitleştirmektir. Öznitelikler sınıflar, veri üyeleri veya üye işlevleri gibi neredeyse tüm C++ yapılarına uygulanabilir. Bu yeni teknolojinin sağladığı avantajların bir vurgusu aşağıda verilmiştir:

  • Tanıdık ve basit bir çağrı kuralını kullanıma sunar.

  • Makroların aksine hata ayıklayıcı tarafından tanınan eklenen kodu kullanır.

  • Zahmetli uygulama ayrıntıları olmadan temel sınıflardan kolay türetme sağlar.

  • Bir COM bileşeni için gereken çok miktarda IDL kodunu birkaç kısa öznitelikle değiştirir.

Örneğin, genel bir ATL sınıfı için basit bir olay havuzu uygulamak için gibi belirli bir sınıfa CMyReceiverevent_receiver özniteliğini uygulayabilirsiniz. Daha event_receiver sonra özniteliği, nesne dosyasına uygun kodu ekleyen Microsoft C++ derleyicisi tarafından derlenmiş olur.

[event_receiver(com)]
class CMyReceiver
{
   void handler1(int i) { ... }
   void handler2(int i, float j) { ... }
}

Daha sonra, event_source kullanarak oluşturabileceğiniz bir olay kaynağından olayları (iç işlev __hook kullanarak) işlemek için ve handler2 yöntemlerini handler1 ayarlayabilirsinizCMyReceiver.

Özniteliklerin Temel Mekanikleri

Projenize öznitelik eklemenin üç yolu vardır. İlk olarak, bunları kaynak kodunuz içine el ile ekleyebilirsiniz. İkincisi, projenizdeki bir nesnenin özellik kılavuzunu kullanarak bunları ekleyebilirsiniz. Son olarak, bunları çeşitli sihirbazları kullanarak ekleyebilirsiniz. Özellikler penceresini ve çeşitli sihirbazları kullanma hakkında daha fazla bilgi için bkz. Visual Studio Projeleri - C++.

Daha önce olduğu gibi, proje oluşturulduğunda, derleyici her C++ kaynak dosyasını ayrıştırarak bir nesne dosyası oluşturur. Ancak, derleyici bir öznitelikle karşılaştığında ayrıştırılır ve bozulmadan doğrulanır. Derleyici daha sonra derleme zamanında kod eklemek veya başka değişiklikler yapmak için bir öznitelik sağlayıcısını dinamik olarak çağırır. Sağlayıcının uygulanması, özniteliğin türüne bağlı olarak farklılık gösterir. Örneğin, ATL ile ilgili öznitelikler Atlprov.dll tarafından uygulanır.

Aşağıdaki şekilde, derleyici ile öznitelik sağlayıcısı arasındaki ilişki gösterilmektedir.

Diagram showing component attribute communication.

Dekont

Öznitelik kullanımı kaynak dosyanın içeriğini değiştirmez. Oluşturulan öznitelik kodunun yalnızca hata ayıklama oturumları sırasında görünür olması gerekir. Ayrıca, projedeki her kaynak dosya için öznitelik değiştirmenin sonuçlarını görüntüleyen bir metin dosyası oluşturabilirsiniz. Bu yordam hakkında daha fazla bilgi için bkz /Fx . (Eklenen Kodu Birleştir) ve Eklenen kodun hatalarını ayıklama.

Çoğu C++ yapısı gibi öznitelikler de uygun kullanımlarını tanımlayan bir dizi özelliğe sahiptir. Bu, özniteliğin bağlamı olarak adlandırılır ve her öznitelik başvuru konusu için öznitelik bağlam tablosunda ele alınır. Örneğin, coclass özniteliği, C++ kaynak dosyasının içinde herhangi bir yere eklenebilen cpp_quote özniteliğinin aksine yalnızca mevcut bir sınıfa veya yapıya uygulanabilir.

Öznitelikli Program Oluşturma

Visual C++ özniteliklerini kaynak kodunuza yerleştirdikten sonra, Microsoft C++ derleyicisinin sizin için bir tür kitaplığı ve .idl dosyası oluşturmasını isteyebilirsiniz. Aşağıdaki bağlayıcı seçenekleri .tlb ve .idl dosyaları oluşturmanıza yardımcı olur:

Bazı projeler birden çok bağımsız .idl dosyası içerir. Bunlar, iki veya daha fazla .tlb dosyası üretmek ve isteğe bağlı olarak bunları kaynak bloğuna bağlamak için kullanılır. Bu senaryo şu anda Visual C++'da desteklenmiyor.

Ayrıca, Visual C++ bağlayıcısı IDL ile ilgili tüm öznitelik bilgilerini tek bir MIDL dosyasına verir. Tek bir projeden iki tür kitaplığı oluşturmanın hiçbir yolu yoktur.

Öznitelik Bağlamları

C++ öznitelikleri dört temel alan kullanılarak açıklanabilir: uygulanabilecekleri hedef (Uygulanır), yinelenebilirse veya değilse (Yinelenebilir), diğer özniteliklerin gerekli varlığı (Gerekli Öznitelikler) ve diğer özniteliklerle uyumsuzluklar (Geçersiz Öznitelikler). Bu alanlar, her özniteliğin başvuru konu başlığındaki eşlik eden bir tabloda listelenir. Bu alanların her biri aşağıda açıklanmıştır.

Uygulandığı Öğe

Bu alan, belirtilen özniteliğin yasal hedefleri olan farklı C++ dil öğelerini açıklar. Örneğin, bir öznitelik Uygulandığı Yer alanında "sınıf" belirtiyorsa, bu, özniteliğin yalnızca yasal bir C++ sınıfına uygulanabileceğini gösterir. Özniteliği bir sınıfın üye işlevine uygulanırsa söz dizimi hatası oluşur.

Daha fazla bilgi için bkz . Kullanım Öznitelikleri.

Tekrarlanabilir

Bu alan, özniteliğin aynı hedefe tekrar tekrar uygulanıp uygulanamayacağını belirtir. Özniteliklerin çoğu yinelenemez.

Gerekli Öznitelikler

Bu alanda, belirtilen özniteliğin düzgün çalışması için mevcut olması gereken diğer öznitelikler (aynı hedefe uygulanır) listelenir. Bir özniteliğin bu alan için herhangi bir girişe sahip olması sık karşılaşılan bir durumdur.

Geçersiz Öznitelikler

Bu alanda, belirtilen öznitelikle uyumsuz olan diğer öznitelikler listelenir. Bir özniteliğin bu alan için herhangi bir girişe sahip olması sık karşılaşılan bir durumdur.

Eklenen kodda hata ayıklama

Özniteliklerin kullanılması C++ programlamayı büyük ölçüde basitleştirebilir. Daha fazla bilgi için bkz . Kavramlar. Bazı öznitelikler doğrudan derleyici tarafından yorumlanır. Diğer öznitelikler, derleyicinin derlediği program kaynağına kod ekler. Eklenen bu kod, yazmanız gereken kod miktarını azaltarak programlamayı kolaylaştırır. Ancak bazen bir hata, eklenen kodu yürütürken uygulamanızın başarısız olmasına neden olabilir. Bu durumda, büyük olasılıkla eklenen koda bakmak isteyeceksiniz. Visual Studio, eklenen kodu görmeniz için iki yol sağlar:

  • Eklenen kodu Ayrıştırma penceresinde görüntüleyebilirsiniz.

  • /Fx kullanarak, özgün ve eklenen kodu içeren birleştirilmiş bir kaynak dosyası oluşturabilirsiniz.

Ayrıştırma penceresi, kaynak koda ve öznitelikler tarafından eklenen koda karşılık gelen derleme dili yönergelerini gösterir. Ayrıca, Ayrıştırma penceresi kaynak kodu ek açıklamasını gösterebilir.

Kaynak Ek Açıklamasını açmak için

  • Ayrıştırma penceresine sağ tıklayın ve kısayol menüsünden Kaynak Kodunu Göster'i seçin.

    Bir özniteliğin kaynak penceresindeki konumunu biliyorsanız, eklenen kodu Ayrıştırma penceresinde bulmak için kısayol menüsünü kullanabilirsiniz.

Eklenen kodu görüntülemek için

  1. Hata ayıklayıcısı kesme modunda olmalıdır.

  2. Kaynak kodu penceresinde, imleci eklenen kodu görüntülemek istediğiniz özniteliğin önüne getirin.

  3. Sağ tıklayın ve kısayol menüsünden Ayrıştırmaya Git'i seçin.

    Öznitelik konumu geçerli yürütme noktasına yakınsa, Hata Ayıkla menüsünden Ayrıştırma penceresini seçebilirsiniz.

Geçerli yürütme noktasında ayrıştırma kodunu görüntülemek için

  1. Hata ayıklayıcısı kesme modunda olmalıdır.

  2. Hata Ayıkla menüsünden Windows'u seçin ve Ayrıştır'a tıklayın.

Bu Bölümde

Öznitelik Programlama SSS
Gruplara Göre Öznitelikler
Kullanıma Göre Öznitelikler
Öznitelikler Alfabetik Başvurusu