Bileşen Nesne Modeli - Component Object Model

Bileşen Nesne Modeli (COM) bir ikili arabirim için standart yazılım bileşenleri tarafından tanıtıldı Microsoft 1993 yılında. etkinleştirmek için kullanılır. arası iletişim nesne geniş bir yelpazede yaratma Programlama dilleri. COM, aşağıdakiler de dahil olmak üzere diğer birçok Microsoft teknolojisinin ve çerçevesinin temelidir: OLE, OLE Otomasyonu, Tarayıcı Yardımcı Nesnesi, ActiveX, COM +, DCOM, Windows kabuğu, DirectX, UMDF ve Windows Çalışma Zamanı. COM'un özü, yaratıldıkları ortamdan farklı ortamlarda, hatta makine sınırları dışında bile kullanılabilen, nesneleri uygulamaya yönelik dilden bağımsız bir yoldur. COM, iyi yazılmış bileşenler için, bileşen uygulayıcılarını iyi tanımlanmış bileşenler sağlamaya zorladığından, iç uygulamaları hakkında hiçbir bilgi olmadan nesnelerin yeniden kullanımına izin verir. arayüzler uygulamadan ayrıdır. Dillerin farklı tahsis semantiği, nesneleri kendi yaratımlarından ve yok etmelerinden sorumlu hale getirerek yerleştirilir. referans sayma. Tip dönüştürme dökümü bir nesnenin farklı arayüzleri arasında, QueryInterface yöntem. COM içinde tercih edilen "kalıtım" yöntemi, yöntem "çağrılarının" delege edildiği alt nesnelerin oluşturulmasıdır.

COM, yalnızca standart olarak tanımlanan ve uygulanan bir arayüz teknolojisidir. Microsoft Windows ve Apple'ın Çekirdek Vakfı 1.3 ve üzeri eklenti uygulama programlama Arayüzü (API).[1] İkincisi, yalnızca tüm COM arayüzünün bir alt kümesini uygular.[2] Bazı uygulamalar için COM, en azından bir dereceye kadar Microsoft .NET çerçeve ve destek Ağ hizmetleri içinden Windows Communication Foundation (WCF). Ancak, COM nesneleri .NET aracılığıyla tüm .NET dillerinde kullanılabilir. COM Birlikte Çalışma. Ağ bağlantılı DCOM ikili kullanır tescilli formatlar WCF, XML tabanlı SABUN mesajlaşma. COM diğerine çok benzer bileşen yazılımı gibi arayüz teknolojileri CORBA ve Kurumsal JavaBeans Her ne kadar her birinin kendi güçlü ve zayıf yönleri olsa da. C ++ 'dan farklı olarak COM, kararlı bir uygulama ikili arabirimi Derleyici sürümleri arasında değişmeyen (ABI).[3] Bu, COM arabirimlerini farklı derleyici sürümleri kullanılarak derlenen istemciler tarafından kullanılacak nesne yönelimli C ++ kitaplıkları için çekici kılar.

Tarih

İlk yöntemlerden biri arası iletişim Windows'ta Dinamik Veri Değişimi (DDE),[4] ilk olarak 1987'de tanıtıldı,[5] uygulamalar arasındaki sözde "konuşmalarda" mesaj gönderip almaya izin veren. Antony Williams COM mimarisinin oluşturulmasında yer alan, daha sonra Microsoft'ta yazılım bileşenleri kavramını benimseyen iki dahili belge dağıttı: Nesne Mimarisi: Dinamik Olarak Genişletilebilir Bir Sınıf Kitaplığında Bilinmeyen - veya - Tür Güvenliği ile Başa Çıkma 1988'de ve Kalıtım Üzerine: Ne İfade Ediyor ve Nasıl Kullanılır? Bunlar, COM'un arkasındaki fikirlerin çoğunun temelini oluşturdu. Nesne Bağlama ve Gömme (OLE), Microsoft'un ilk nesne tabanlı çerçevesi, DDE üzerine inşa edildi ve özellikle bileşik belgeler. İle tanıtıldı Windows için Word ve Excel 1991'de, ve daha sonra 1992'de 3.1 sürümünden başlayarak Windows'a dahil edildi. Bileşik belge örneği, hesap tablosu Windows için Word belgesine katıştırılmış: Excel içindeki elektronik tabloda değişiklikler yapıldığında, bunlar Word belgesinin içinde otomatik olarak görünür.

1991 yılında Microsoft, Visual Basic Uzantıları (VBX) ile Visual Basic 1.0. Bir VBX, bir dinamik bağlantı kitaplığı (DLL) nesnelerin bir forma grafik olarak yerleştirilmesine ve özellikleri ve yöntemler. Bunlar daha sonra diğer diller tarafından kullanılmak üzere uyarlandı. Görsel C ++. 1992'de, sürüm Windows 3.1 Microsoft, temelini oluşturan OLE 2'yi piyasaya sürdü. nesne modeli. Com Uygulama ikili arayüzü (ABI), MAPI ABI (1992'de piyasaya sürüldü) ile aynıydı ve temel aldığı gibi MSRPC ve nihayetinde Açık Grup 's DCE / RPC. OLE 1 bileşik belgelere odaklanırken, COM ve OLE 2 genel olarak yazılım bileşenlerini ele almak için tasarlandı. Metin konuşmaları ve Windows mesajlarının, uygulama özelliklerinin sağlam ve genişletilebilir bir şekilde paylaşılmasına izin verecek kadar esnek olmadığı kanıtlandı, bu nedenle COM yeni bir temel olarak oluşturuldu ve OLE, OLE2 olarak değiştirildi. 1994 yılında OLE özel denetimleri (OCX'ler), VBX kontrollerinin halefi olarak tanıtıldı. Aynı zamanda Microsoft, OLE 2'nin sadece "OLE" olarak bilineceğini ve OLE'nin artık bir kısaltma değil, şirketin tüm bileşen teknolojileri için bir isim olduğunu belirtti. 1996'nın başlarında Microsoft, OLE Özel Kontrolleri için yeni bir kullanım buldu, Web tarayıcısının içerik sunma kapasitesini genişleterek, OLE'nin İnternet "ActiveX "ve tüm OLE teknolojilerini yavaş yavaş ActiveX olarak yeniden adlandırdı. Microsoft Office. O yılın ilerleyen saatlerinde Microsoft, COM'u ağ üzerinde çalışacak şekilde genişletti DCOM.[6]

İlgili teknolojiler

COM, Windows için en önemli yazılım geliştirme platformuydu ve bu nedenle bir dizi destekleyici teknolojinin geliştirilmesini etkiledi. Aynı şekilde önceki teknolojilerden de büyük ölçüde etkilendi.

DDE

COM değiştirildi DDE süreçler arası iletişimin tercih edilen şekli olarak.

DCE / RPC ve MSRPC

Bir diller arası bileşen modeli olarak COM, nesneleri ve ilişkili işlevleri açıklamak için bir arayüz tanımlama diline veya IDL'ye dayanır. COM IDL, ağırlıklı olarak nesne yönelimli uzantılarla zengin özelliklere sahip DCE / RPC IDL'ye dayanır. Microsoft'un MSRPC olarak bilinen kendi DCE / RPC uygulaması, Windows NT hizmetleri ve dahili bileşenler için birincil süreçler arası iletişim mekanizması olarak yoğun bir şekilde kullanılmaktadır ve bu da onu açık bir temel seçimi haline getirmektedir.

DCOM

DCOM (Dağıtılmış COM) COM erişimini, Windows masaüstünde iletişim kuran ayrı uygulamalarla tek bir kullanıcıyı desteklemekten, farklı güvenlik bağlamları altında ve ağdaki farklı makinelerde çalışan nesneleri etkinleştirmeye kadar genişletti. Bununla birlikte, hangi kullanıcıların nesneleri oluşturma, etkinleştirme ve arama yetkisine sahip olduğunu yapılandırmak, arayan kullanıcıyı tanımlamak ve aramaların güvenliği için gerekli şifrelemeyi belirlemek için gerekli özellikler eklendi.

COM +

Microsoft'un geliştiricilere aşağıdaki konularda destek sağlaması için dağıtılmış işlemler Microsoft, kaynak havuzu, bağlantısı kesilen uygulamalar, olay yayınlama ve abonelik, daha iyi bellek ve işlemci (iş parçacığı) yönetimi ve Windows'u diğer kurumsal düzey işletim sistemlerine alternatif olarak konumlandırmak için Microsoft, Microsoft İşlem Sunucusu (MTS) Windows NT 4 üzerinde. Windows 2000 ile, COM'un bu önemli uzantısı işletim sistemine dahil edildi (bir dizi harici araçtan farklı olarak) MTS ) ve yeniden adlandırıldı COM +. Aynı zamanda Microsoft, DCOM ayrı bir varlık olarak. COM + hizmetlerinden yararlanan bileşenler, eklenen COM + katmanı tarafından, özellikle de müdahale için işletim sistemi desteği tarafından daha doğrudan ele alındı. MTS'nin ilk sürümünde, müdahaleye değinildi - bir MTS bileşeninin yüklenmesi, Windows Kayıt Defteri doğrudan bileşeni değil, MTS yazılımını aramak için. Windows 2000, COM + bileşenlerini yapılandırmak için kullanılan Bileşen Hizmetleri kontrol paneli uygulamasını da revize etti.

COM + 'nın bir avantajı, "bileşen çiftliklerinde" çalıştırılabilmesiydi. Bir bileşenin örnekleri, uygun şekilde kodlanırsa havuzlanabilir ve bellekten kaldırılmadan başlangıç ​​rutinine yapılan yeni çağrılarla yeniden kullanılabilir. Bileşenler de dağıtılabilir (başka bir makineden çağrılabilir). COM + ve Microsoft Visual Studio istemci tarafında proxy oluşturmayı kolaylaştırmak için araçlar sağladı, bu nedenle uzaktan arama yapmak için DCOM kullanılsa da, geliştiriciler için bunu yapmak kolaydı. COM + ayrıca bir abone / yayıncı olay mekanizması tanıttı: COM + Etkinliklerive yararlanmanın yeni bir yolunu sağladı MSMQ (uygulamalar arası eşzamansız mesajlaşma sağlayan bir teknoloji) olarak adlandırılan bileşenlerle Sıraya Alınmış Bileşenler. COM + olayları, COM + programlama modelini geç bağlanmayı desteklemek için genişletir (bkz. Geç bağlama ) yayıncı veya abone ile olay sistemi arasındaki olaylar veya yöntem çağrıları.

.AĞ

Microsoft .NET, hem bileşen teknolojisi sağlamak hem de COM + ile etkileşim (COM-birlikte çalışma derlemeleri aracılığıyla) için araçlar sağlar; .NET, yaygın olarak kullanılan COM denetimlerinin çoğuna sarmalayıcılar sağlar. Microsoft .NET, bileşen oluşturmadan en fazla ayrıntıyı gizler ve bu nedenle geliştirmeyi kolaylaştırır. .NET, System.EnterpriseServices ad alanı aracılığıyla COM + 'dan yararlanabilir ve COM +' nın sağladığı hizmetlerin çoğu, .NET'in son sürümlerinde çoğaltılmıştır. Örneğin, .NET'teki System.Transactions ad alanı, COM + 'ya başvurmadan işlem yönetimi sağlayan TransactionScope sınıfını sağlar. Benzer şekilde, sıraya alınmış bileşenler ile değiştirilebilir Windows Communication Foundation bir ile MSMQ Ulaşım. (MSMQ yerel bir COM bileşenidir, ancak) Geriye dönük uyumluluk için sınırlı destek vardır. Bir COM nesnesi, .NET'te bir Çalışma Zamanı Çağrılabilir Sarmalayıcı (RCW)[7] Belirli arabirim kısıtlamalarına uyan .NET nesneleri, COM nesnelerinde bir COM çağrılabilir sarmalayıcı (CCW).[8] Hem COM hem de .NET tarafında, diğer teknolojiyi kullanan nesneler yerel nesneler olarak görünür. Görmek COM Birlikte Çalışma.WCF (Windows Communication Foundation), COM'un bir dizi uzaktan yürütme zorluğunu kolaylaştırır. Örneğin, nesnelerin işlem veya makine sınırları boyunca daha kolay bir şekilde değere göre şeffaf bir şekilde sıralanmasını sağlar.

Windows Çalışma Zamanı

Microsoft'un yeni Windows Çalışma Zamanı (veya WinRT, karıştırılmamalıdır) Windows RT ) programlama ve uygulama modeli temelde COM tabanlı bir API'dir, ancak gelişmiş bir COM'a dayanır. COM benzeri temeli nedeniyle, Windows Çalışma Zamanı, COM'un yaptığı gibi, birden çok dilde nispeten kolay arabirim oluşturmaya izin verir, ancak esasen yönetilmeyen, yerel bir API'dir. Bununla birlikte, API tanımları, ECMA 335 meta veri biçiminde kodlanan ".winmd" dosyalarında saklanır. CLI meta verileri .NET'in birkaç değişiklikle kullandığı biçim. Bu yaygın meta veri formatı, WinRT .NET uygulamalarından çağrıldığında P / Invoke'tan önemli ölçüde daha az ek yük sağlar ve sözdizimi çok daha basittir.

Güvenlik

COM ve ActiveX bileşenleri, korumalı alan olmadan kullanıcının makinesinde yerel kod olarak çalıştırılır. Bu nedenle, kodun yapabilecekleri konusunda çok az kısıtlama vardır. ActiveX bileşenlerini web sayfalarına gömmenin önceki uygulaması Internet Explorer bu nedenle sorunlara yol açtı mı kötü amaçlı yazılım enfeksiyonlar. Microsoft, ActiveX ile ilgili sorunu 1996'da Charles Fitzgerald'ın "ActiveX'in doğası gereği güvenli olduğu iddiasını asla önden yapmadık" dediği zaman fark etti.[9] Son[ne zaman? ] Internet Explorer sürümleri, ActiveX denetimlerini yüklemeden önce kullanıcıya bilgi verir ve kullanıcının güvenmediği sitelerden denetimlerin yüklenmesine izin vermemesini sağlar. ActiveX kontrolleri imzalı ile dijital imzalar orijinalliklerini garanti etmek için. ActiveX denetimlerini tamamen devre dışı bırakmak veya yalnızca birkaç tanesine izin vermek de mümkündür. İşlem dışı COM sunucuları için şeffaf destek, hala yazılım güvenliğini desteklemektedir. süreç izolasyonu. Bu, büyük uygulamaların alt sistemlerini ayrı işlemlere ayırmak için yararlı olabilir. İşlem izolasyonu, bir süreçteki durum bozulmasının diğer işlemlerin bütünlüğünü olumsuz etkilemesini sınırlar çünkü bunlar yalnızca kesin olarak tanımlanmış arabirimler aracılığıyla iletişim kurarlar. Bu nedenle, geçerli durumu yeniden kazanmak için yalnızca etkilenen alt sistemin yeniden başlatılması gerekir. Bu, aynı süreç içindeki alt sistemler için geçerli değildir. haydut işaretçi bir alt sistemde diğer alt sistemleri rastgele bozabilir.

Teknik detaylar

COM programcıları yazılımlarını COM'a duyarlı kullanarak oluşturur bileşenleri. Farklı bileşen türleri, sınıf kimlikleri (CLSID'ler) ile tanımlanır. Küresel Olarak Benzersiz Tanımlayıcılar (GUID'ler). Her COM bileşeni, işlevselliğini bir veya daha fazla arayüzler. Bir bileşen tarafından desteklenen farklı arabirimler, GUID'ler olan arabirim kimlikleri (IID'ler) kullanılarak birbirinden ayırt edilir. COM arayüzlerinde bağlamalar gibi birkaç dilde C, C ++, Visual Basic, Delphi, Python[10][11] ve Windows platformunda uygulanan birkaç komut dosyası dili. Bileşenlere tüm erişim, yöntemler arayüzlerin. Bu, süreçler arası veya hatta bilgisayarlar arası programlama (ikincisi DCOM desteğini kullanarak) gibi tekniklere izin verir.

Arayüzler

Tüm COM bileşenleri, IBilinmeyen (özel) için yöntemleri ortaya çıkaran arabirim referans sayma ve tür dönüşümü (döküm). Bir özel IUnknown arayüzü, bir sanal yöntem tablosu Arabirimde bildirilen işlevlerin arabirimde bildirildikleri sırayla, arabirimde bildirilen işlevlerin işaretçilerinin bir listesini içerir. Bu nedenle, işlem içi çağrı ek yükü, içindeki sanal yöntem çağrılarıyla karşılaştırılabilir. C ++. Ek olarak özel arabirimler, COM da destekler sevk etmek miras alan arayüzler IDispatch. Sevk arayüzleri desteği geç bağlama için OLE Otomasyonu. Bu izin verir sevk etmek daha geniş bir programlama dilleri yelpazesinden yerel olarak erişilebilecek arayüzler özel arayüzler.

Sınıflar

Bir COM sınıfı ("coclass"), bir veya daha fazla arabirimin somut bir uygulamasıdır ve içindeki sınıflara çok benzer nesne yönelimli programlama Diller. Sınıflar, sınıf kimliklerine göre oluşturulur (CLSID ) veya programlı tanımlayıcı dizelerine (progid) göre. Birçok nesne yönelimli dil gibi, COM da arayüzün uygulamadan ayrılmasını sağlar. Bu ayrım, nesnelere doğrudan erişilemeyen, ancak yalnızca arayüzleri aracılığıyla erişilebilen COM'da özellikle güçlüdür. COM, aynı arabirimin birden çok uygulamasını da destekler, böylece istemciler Çalışma süresi hangi arayüz uygulamasının başlatılacağını seçebilir.

Arayüz Tanımlama Dili ve tür kitaplıkları

Tür kitaplıkları, COM türlerini temsil eden meta verileri içerir. Bu türler kullanılarak açıklanmıştır Microsoft Arayüz Tanımlama Dili (MSIDL / IDL). IDL dosyaları, nesne yönelimli sınıfları, arayüzleri, yapıları, numaralandırmaları ve diğer kullanıcı tanımlı türleri dilden bağımsız bir şekilde tanımlar. IDL, arayüzleri ve sınıf koleksiyonlarını tanımlamak için "arayüz" ve "kitaplık" gibi bazı ek anahtar kelimelerle C ++ bildirimlerine görünüm olarak benzer. IDL ayrıca arabirim GUID'leri ve işaretçi parametreleri ile uzunluk alanları arasındaki ilişkiler gibi ek bilgiler sağlamak için bildirimlerden önce köşeli parantez içine alınmış özniteliklerin kullanımını da destekler. IDL dosyaları MIDL tarafından derlenir derleyici. C / C ++ için, MIDL derleyicisi, derleyiciden bağımsız bir başlık dosyası oluşturur. vtbls bildirilen arabirimler ve arabirimin bildirimlerini içeren bir C dosyası GUID'ler. Bir proxy modülü için C ++ kaynak kodu, MIDL derleyicisi tarafından da oluşturulabilir. Bu proxy, COM çağrılarını dönüştürmeye yönelik yöntem saplamaları içerir. uzaktan prosedür çağrıları işlem dışı iletişim için DCOM'u etkinleştirmek için. IDL dosyaları ayrıca MIDL derleyicisi tarafından bir tür kitaplığı (TLB) olarak derlenebilir. TLB dosyaları, TLB'de tanımlanan COM türlerini temsil edecek dile özgü yapılar oluşturmak için farklı dil derleyicileri ve çalışma zamanı ortamları (örneğin, VB, Delphi, .NET vb.) Tarafından işlenebilen ikili meta veriler içerir. C ++ için bu, TLB'yi IDL temsiline geri dönüştürecektir.

Nesne çerçevesi olarak COM

COM bir çalışma zamanı çerçevesi olduğundan, türlerin çalışma zamanında ayrı ayrı tanımlanabilir ve belirtilebilir olması gerekir. Bunu başarmak için, küresel olarak benzersiz tanımlayıcılar (GUID'ler) kullanılır. Her COM türü, çalışma zamanında tanımlama için kendi GUID'ine atanır. COM türleri hakkındaki bilgilerin hem derleme zamanında hem de çalışma zamanında erişilebilir olması için COM, tür kitaplıklarını kullanır. Etkili kullanımı yoluyla tür kitaplıkları COM, nesnelerin etkileşimi için dinamik bir çerçeve olarak yeteneklerini gerçekleştirir.

Bir IDL'deki aşağıdaki örnek coclass tanımını düşünün:

coclass SomeClass {[varsayılan] arayüz ISomeInterface;};

Yukarıdaki kod parçası, adında bir COM sınıfını bildirir Bazı Sınıflar adlı bir arayüz uygulayan ISomeInterface.

Bu, kavramsal olarak aşağıdaki C ++ sınıfını tanımlamaya eşdeğerdir:

sınıf Bazı Sınıflar : halka açık ISomeInterface {  ...  ...};

ISomeInterface bir C ++ olduğunda saf sanal sınıf (bazen soyut temel sınıf olarak adlandırılır).

COM arabirimlerini ve sınıflarını içeren IDL dosyaları, daha sonra bir nesnenin hangi arabirimleri desteklediğini belirlemek ve bir nesnenin arabirim yöntemlerini çağırmak için çalışma zamanında istemciler tarafından ayrıştırılabilen tür kitaplıkları (TLB) dosyaları halinde derlenir.

C ++ 'da, COM nesnelerinin örneği CoCreateInstance sınıf kimliğini (CLSID) ve arabirim kimliğini (IID) bağımsız değişken olarak alan işlev. Örnekleme Bazı Sınıflar aşağıdaki gibi uygulanabilir:

ISomeInterface* interface_ptr = BOŞ;HRESULT saat = CoCreateInstance(CLSID_SomeClass, BOŞ, CLSCTX_ALL,                              IID_ISomeInterface, (geçersiz**)&interface_ptr);

Bu örnekte, COM alt sistemi, uygulayan bir nesneye işaretçi elde etmek için kullanılır. ISomeInterface arabirim ve ortak sınıf CLSID_SomeClass'ın bu arabirimin özel uygulaması gereklidir.

Referans sayma

Tüm COM nesneleri kullanır referans sayma nesne yaşam sürelerini yönetmek için. Referans sayıları müşteriler tarafından kontrol edilir. AddRef ve Serbest bırakmak Tüm COM nesnelerinin uyguladığı zorunlu IUnknown arabirimindeki yöntemler. COM nesneleri, referans sayısı sıfıra düştüğünde kendi belleğini boşaltmaktan sorumludur. Belirli diller (ör. Visual Basic ), COM nesnesi geliştiricilerinin kaynak kodlarında herhangi bir dahili referans sayacını açıkça tutmasına gerek kalmaması için otomatik referans sayımı sağlar. C ++ 'da, bir kodlayıcı açık referans sayımı gerçekleştirebilir veya akıllı işaretçiler referans sayılarını otomatik olarak yönetmek için.

Aşağıdakiler ne zaman arayacağınıza dair yönergelerdir AddRef ve Serbest bırakmak COM nesnelerinde:

  • Arayüz referanslarını döndüren işlevler ve yöntemler (dönüş değeri veya "çıkış" parametresi aracılığıyla), geri dönmeden önce döndürülen nesnenin referans sayısını artıracaktır.
  • Serbest bırakmak işaretçinin üzerine yazılmadan veya kapsam dışına çıkmadan önce bir arabirim işaretçisinde çağrılmalıdır.
  • Bir arayüz referans işaretçisinde bir kopya yapılırsa, AddRef o işaretçiye çağrılmalıdır.
  • AddRef ve Serbest bırakmak Bir nesne, dahili kaynakları sadece referans verilen arayüzler için tahsis etmek amacıyla arayüz başına referans sayıları uygulayabileceğinden, referans verilen özel arayüzde çağrılmalıdır.

Referans sayım çağrılarının tümü tel üzerinden uzak nesnelere gönderilmez; bir proxy, uzak nesnede yalnızca bir referans saklar ve kendi yerel referans sayısını korur. COM geliştirmeyi basitleştirmek için Microsoft, ATL (Etkin Şablon Kitaplığı) C ++ geliştiricileri için. ATL, daha yüksek düzeyde bir COM geliştirme paradigması sağlar. Ayrıca, COM istemci uygulama geliştiricilerini, referans sayımını doğrudan sürdürme ihtiyacından korur. akıllı işaretçi nesneler. COM ile uyumlu diğer kitaplıklar ve diller arasında Microsoft Foundation Classes, VC Derleyici COM Desteği,[12] VBScript, Visual Basic, ECMAScript (JavaScript ) ve Borland Delphi.

Programlama

COM bir dilden bağımsız İkili tanımlı veri türlerini ve arayüzlerini anlayabilen ve uygulayabilen herhangi bir programlama dilinde geliştirilebilen ikili standart. COM uygulamaları, COM ortamına girip çıkma, COM nesnelerini örnekleme ve referans sayma, desteklenen arabirimler için nesneleri sorgulama ve hataları işlemekten sorumludur. Microsoft Visual C ++ derleyicisi, C ++ dil olarak anılır C ++ Nitelikleri.[13] Bu uzantılar, COM geliştirmeyi basitleştirmek ve C ++ 'da COM sunucularını uygulamak için gereken tesisat kodunun çoğunu kaldırmak için tasarlanmıştır.[14]

Kayıt defteri kullanımı

Windows'ta COM sınıfları, arabirimleri ve tür kitaplıkları, kayıt, altında HKEY_CLASSES_ROOT CLSID sınıflar için ve HKEY_CLASSES_ROOT Arayüz arayüzler için. COM kitaplıkları, her COM nesnesi için doğru yerel kitaplıkları veya bir uzak hizmet için ağ konumunu bulmak için kayıt defterini kullanır.

Kayıt gerektirmeyen COM

Kayıt gerektirmeyen COM (RegFree COM), Windows XP Bileşen Nesne Modeline (COM) izin veren bileşenleri aktivasyonu saklamak için meta veriler ve CLSID (Sınıf İD) kullanmadan bileşen için kayıt. Bunun yerine, bileşende uygulanan sınıfların meta verileri ve CLSID'leri bir montaj bildirimi (kullanılarak açıklanmıştır XML ), yürütülebilir dosyada bir kaynak olarak veya bileşenle birlikte yüklenen ayrı bir dosya olarak saklanır.[15] Bu, aynı bileşenin birden çok sürümünün, kendi bildirimleriyle açıklanan farklı dizinlere kurulmasına ve ayrıca XCOPY dağıtımı.[16] Bu teknik, EXE COM sunucuları için sınırlı desteğe sahiptir.[17] ve gibi sistem çapında bileşenler için kullanılamaz MDAC, MSXML, DirectX veya Internet Explorer.

Uygulama yüklemesi sırasında, Windows yükleyici bildirimi arar.[18] Varsa, yükleyici ondan aktivasyon içeriğine bilgi ekler.[16] COM sınıfı fabrikası bir sınıfı başlatmaya çalıştığında, etkinleştirme içeriği ilk olarak CLSID için bir uygulamanın bulunup bulunmadığını görmek için kontrol edilir. Yalnızca arama başarısız olursa kayıt tarandı.[16]

COM nesnelerini manuel olarak örnekleme

COM nesneleri aynı zamanda manuel olarak da oluşturulabilir. DLL dosya ve GUID nesnenin. Bu, DLL veya GUID'in sistem kayıt defterine kaydedilmesini gerektirmez ve bildirim dosyalarını kullanmaz. COM DLL, DllGetClassObject adlı bir işlevi verir. DllGetClassObject öğesini istenen GUID ve IID_IClassFactory ile çağırmak, bir fabrika nesnesi. Factory nesnesinin, bir arabirim GUID'si verilen bir nesnenin örneklerini oluşturabilen bir CreateInstance yöntemi vardır.[19] Bu, kayıtlı COM bileşenlerinin örneklerini oluştururken dahili olarak kullanılan işlemin aynısıdır.[20]

Oluşturulan COM nesnesi, genel CoCreateInstance API'sini kullanarak başka bir COM nesnesini başlatırsa, bunu kayıt defteri veya bildirim dosyalarını kullanarak olağan genel yöntemle yapmaya çalışır. Ancak dahili nesneler oluşturabilir (hiç kaydedilemeyebilir) ve kendi özel bilgisini kullanarak bunlara arayüzlere referanslar dağıtabilir.

Süreç ve ağ şeffaflığı

COM nesneleri şeffaf bir şekilde örneklenebilir ve aynı işlem içinden (işlem içi), işlem sınırları boyunca (işlem dışı) veya ağ üzerinden uzaktan (DCOM) referans alınabilir. İşlem dışı ve uzak nesnelerin kullanımı Marshalling yöntem çağrılarını serileştirmek ve süreç veya ağ sınırları üzerinden değer döndürmek için. Bu sıralama, nesneye yerel bir süreç içi nesne gibi erişen istemci tarafından görünmez.

Diş çekme

COM'da, iş parçacığı, olarak bilinen bir kavram aracılığıyla ele alınır. daireler.[21] Tek bir COM nesnesi, tek iş parçacıklı veya çok iş parçacıklı olabilen tam olarak bir dairede yaşar. COM'da üç tip daire bulunmaktadır: Tek Dişli Daire (STA), Çok Parçacıklı Daire (MTA), ve Thread Nötr Daire (NA). Her daire, bir nesnenin dahili durumunun birden çok iş parçacığı arasında senkronize edilebildiği bir mekanizmayı temsil eder. Bir işlem, bazıları STA ve diğerleri MTA kullanabilen birden çok COM nesnesinden oluşabilir. COM nesnelerine erişen tüm iş parçacıkları benzer şekilde bir dairede yaşar. COM nesneleri ve iş parçacıkları için apartman seçimi çalışma zamanında belirlenir ve değiştirilemez.

Daire tipiAçıklama
Tek Dişli Daire[22] (STA), (ThreadingModel =Apartman)Tek bir evre, nesnenin yöntemlerini yürütmek için ayrılmıştır. Böyle bir düzenlemede, apartman dışındaki iş parçacıklarından yöntem çağrıları sıralı ve sistem tarafından otomatik olarak sıraya alınır (standart bir Windows ileti kuyruğu aracılığıyla). Bu nedenle, COM çalışma zamanı, bir nesnenin her yöntem çağrısının bir başkası çağrılmadan önce her zaman tamamlanana kadar yürütülmesini sağlamak için otomatik eşitleme sağlar. Bu nedenle geliştiricinin diş kilitlemesi veya yarış koşulları hakkında endişelenmesine gerek yoktur.
Çok Dişli Daire[23] (MTA), (ThreadingModel =Bedava)COM çalışma zamanı senkronizasyon sağlamaz ve birden çok iş parçacığının aynı anda COM nesnelerini çağırmasına izin verilir. Bu nedenle COM nesnelerinin, birden çok iş parçacığından eşzamanlı erişimin bir yarış durumuna neden olmasını önlemek için kendi senkronizasyonunu gerçekleştirmesi gerekir. STA'daki bir iş parçacığından bir MTA nesnesine yapılan çağrılar da sıralanır.
Dinamik olarak belirlenen daire (ThreadingModel =Her ikisi de)İçinde Her ikisi de apartman modunda, sunucu, çağıran iş parçacığının grup tipiyle eşleşmesi için nesne oluştururken STA veya MTA'yı otomatik olarak seçer.[24] Bu, MTA sunucularına bir STA iş parçacığı tarafından erişildiğinde ek yükü sıralamaktan kaçınmak için yararlı olabilir.
Thread Nötr Daire (NA), (ThreadingModel =Nötr)Herhangi bir iş parçacığı olmayan özel bir daire. Bir STA veya MTA iş parçacığı aynı işlemde bir NA nesnesini çağırdığında, çağıran iş parçacığı geçici olarak apartmanını terk eder ve herhangi bir iş parçacığı geçişi olmaksızın doğrudan NA'da kodu yürütür.[25] Bu nedenle NA, verimli bölümler arası yöntem çağrıları için bir optimizasyon olarak düşünülebilir.

Aynı daireye ait olan iş parçacığı ve nesneler, aynı iş parçacığı erişim kurallarına uyar. Aynı daire içinde yapılan yöntem çağrıları, bu nedenle, COM'un herhangi bir yardımı olmadan doğrudan gerçekleştirilir. Daireler arasında yapılan yöntem çağrıları, sıralama yoluyla gerçekleştirilir. Bu, proxy'lerin ve saplamaların kullanılmasını gerektirir.

Eleştiriler

COM oldukça karmaşık bir uygulamaya sahip olduğundan, programcıların bazı "tesisat" sorunları nedeniyle dikkati dağılabilir.

Mesaj pompalama

Bir STA başlatıldığında, apartmanlar arası ve süreçler arası mesaj yönlendirmesi için kullanılan gizli bir pencere oluşturur. Bu pencerenin mesaj kuyruğu düzenli olarak "pompalanmalıdır". Bu yapı "mesaj pompası ". Windows'un önceki sürümlerinde, bunun yapılmaması sistem genelinde kilitlenmelere neden olabilir. Bu sorun, COM'u uygulamalarının bir parçası olarak başlatan ve uygulama ayrıntılarının" sızmasına "neden olan bazı Windows API'leri tarafından karmaşıktır.

Referans sayma

COM içinde referans sayımı, iki veya daha fazla nesne varsa sorunlara neden olabilir. döngüsel olarak referans. Bir uygulamanın tasarımında, nesnelerin öksüz bırakılmaması için bunu hesaba katması gerekir. COM "olay havuzu" modeli kullanılıyorsa, nesneler de etkin referans sayılarıyla bırakılabilir. Olayı tetikleyen nesne, olaya tepki veren nesneye bir referansa ihtiyaç duyduğundan, ikincisinin referans sayısı asla sıfıra ulaşmayacaktır. Referans döngüleri tipik olarak bant dışı sonlandırma veya bölünmüş kimlikler kullanılarak bozulur. Bant dışı sonlandırma tekniğinde, bir nesne çağrıldığında onu diğer nesnelere olan referanslarını bırakmaya zorlayan ve böylece döngüyü bozan bir yöntemi ortaya çıkarır. Bölünmüş kimlik tekniğinde, tek bir uygulama iki ayrı COM nesnesini (kimlikler olarak da bilinir) ortaya çıkarır. Bu bir zayıf referans COM nesneleri arasında, bir referans döngüsünü engelleyerek.

DLL Cehennemi

İşlem içi COM bileşenleri DLL dosyalarında uygulandığından ve kayıt, CLSID başına yalnızca tek bir sürüme izin verdiğinden, bazı durumlarda "DLL Cehennemi "etkisi. Kayıtsız COM özelliği, işlem içi bileşenler için bu sorunu ortadan kaldırır; kayıtsız COM, işlem dışı sunucular için kullanılamaz.

Ayrıca bakınız

Notlar

  1. ^ "Dokümantasyon Arşivi". developer.apple.com.
  2. ^ "Eklentiler ve Microsoft'un COM". Apple Inc. Alındı 5 Ekim 2010.
  3. ^ Microsoft forumu: Visual C ++ sürümleri arasında ikili uyumluluk
  4. ^ "Ağ DDE - Windows uygulamaları hakkında". Microsoft.com. 30 Mayıs 2018.
  5. ^ "Kod Yürütme Tekniği Dinamik Veri Alışverişinden Yararlanıyor". McAfee.com. 27 Ekim 2017.
  6. ^ "draft-brown-dcom-v1-spec-03 - Dağıtılmış Bileşen Nesne Modeli Protokolü - DCOM / 1.0". datatracker.ietf.org. Alındı 29 Ağustos 2019.
  7. ^ rpetrusha. "Çalışma Zamanı Çağrılabilir Sarmalayıcı". msdn.microsoft.com.
  8. ^ rpetrusha. "COM Çağrılabilir Sarmalayıcı". msdn.microsoft.com.
  9. ^ Steinberg, Jill (1 Mart 1997). "Rekabet eden bileşenler dikenli panelistler yaratır". JavaWorld. Alındı 2020-07-16.
  10. ^ "win32com Dokümantasyon Dizini". docs.activestate.com.
  11. ^ "Python ve COM". www.boddie.org.uk.
  12. ^ "Derleyici COM Desteği". MSDN. Microsoft.
  13. ^ Microsoft MSDN: C ++ Öznitelik Başvurusu
  14. ^ MSDN Dergisi: C ++ Öznitelikleri: Visual Studio .NET'teki Yeni Özellik ile COM Programlamayı Bir Esinti Yapın
  15. ^ "Montaj Manifestoları". MSDN. Alındı 5 Kasım 2009.
  16. ^ a b c Dave Templin. "ClickOnce ve Kayıtsız COM ile Uygulama Dağıtımını Basitleştirin". MSDN Dergi. Alındı 22 Nisan, 2008.
  17. ^ "İşlem dışı bir COM sunucusu tlb dosyası olmadan nasıl kullanılır". Alındı 16 Nisan 2011.
  18. ^ "İzole Uygulamalar ve Yan Yana Montajlar Kavramları". MSDN. Alındı 5 Şubat 2016.
  19. ^ Arkhipov, Mikhail (1 Nisan 2005). "Kayıtsız COM". MSDN Blogları. Alındı 29 Nisan 2016.
  20. ^ "DllGetClassObject giriş noktası (COM)". MSDN. CoGetClassObject işlevine yapılan bir çağrı, DLL'ye yüklenecek sınıf nesnesini bulursa, CoGetClassObject DLL'nin dışa aktarılan DllGetClassObject işlevini kullanır.
  21. ^ Microsoft MSDN: Süreçler, Konular ve Daireler
  22. ^ Microsoft MSDN: Tek Dişli Daireler
  23. ^ Microsoft MSDN: Çok iş parçacıklı daireler
  24. ^ Microsoft MSDN: COM Diş Açma Modellerini Anlama ve Kullanma
  25. ^ Codeguru: COM Dairelerini Anlamak

Referanslar

Dış bağlantılar