Makale numarası: 206076 - Son Gözden Geçirme: 22 Mayıs 2008 Perşembe - Gözden geçirme: 7.0

Arabirim üzerinden, Visual C++ apartmanlar sıralamakta nasıl

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.
Not Visual C++ 2008, Visual C++ 2005, Visual C++ .NET 2003 ve Microsoft Visual C++ .NET 2002, Microsoft .NET Framework tarafından sağlanan bir yönetilen kod model hem de yerel Microsoft Windows kod modeli yönetilmeyen destekler. Bu makaledeki bilgiler yalnızca yönetilmeyen Visual C++ kod uygulanır.
Hepsini aç | Hepsini kapa

Özet

Marshal.exe arabirim apartmanlar dizme, farklı yollar gösteren bir örnektir.

Daha fazla bilgi

Aşağıdaki dosya Microsoft Yükleme Merkezi'nden yüklenebilir:

Bu resmi kapatBu resmi aç
Download
Download the Marshal.exe package now. (http://download.microsoft.com/download/vc60pro/info2/1/win98/en-us/marshal.exe)

Microsoft Destek dosyalarını karşıdan yükleme hakkında daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
119591  (http://support.microsoft.com/kb/119591/ ) Microsoft Destek Dosyaları Çevrimiçi Hizmetler'den Nasıl Alınır
Microsoft bu dosyada virüs taraması yapmıştır. Microsoft, dosyanın kullanıma sunulduğu tarihteki en güncel virüs tarama yazılımını kullanmıştır. Dosya, üzerinde herhangi bir yetkisiz değişiklik yapılmasını engellemeye yardım eden geliştirilmiş güvenliğe sahip sunucularda depolanır.

Coınitialize() veya Coınitializeex (NULL, COINIT_APARTMENTTHREADED) ile başlatılan bir iş parçacığı Single-Threaded Grup (STA) var. Ayrıca, COM kullanan başka iş aynı işlemde aynı zamanda Coınitialize() veya CoInitializeEx(), iş parçacığı için COM başlatılamadı çağırmalısınız.

Bir STA'de bir COM nesnesi oluşturursanız, iş parçacığı, siz bir arabirim işaretçisi başka bir STA iş parçacığı ve çağrı dışarı bu işaretçiyi geçirilemez. Seri hale getirilmek üzere STA nesnelerine çağrıları için beklenen olduğundan, COM bu yalnızca bir iş parçacığının STA nesnesine (oluşturulduğu iş parçacığının) çağırmasına izin vererek zorlar. Ikinci STA iş parçacığı için geçmesi arabirim işaretçisi bir işaretçi proxy, HRESULT 0x8001010E, veya <a1>RPC_E_WRONG_THREAD</a1> (uygulama sıralanmış bir arabirim için farklı bir iş parçacığı olarak adlandırılır) bir hata alırsınız. Arabirim işaretçisi doğrudan bir nesne işaretçisi, COM seri hale getirme zorlamayacaktır Yukarıdaki hata iletisi alır ve arabirim yöntem çağrısı yapılmayacak. Ancak, bu yine de geçersiz istemci bölümüne tarafındaki davranıştır.

Proxy sunucusu üzerinden bunu sürece, yine de yöntemleri STA nesnesinde farklı bir STA iş parçacığı çağırabilir. Proxy arabirimi sıralama/unmarshaling aracılığıyla elde bir kopyasıdır. Bir iş parçacığının anahtar ve çağrı COM yapar) proxy üzerinden bir arama yapmak, STA nesnenin oluşturulduğu iş parçacığının içeriğinde çalışan en sona erdirir.

Bir arabirim için başka bir STA iş parçacığı sıralama/unmarshal üç yolu vardır:
  1. CoMarshalInterThreadInterfaceInStream() ve CoGetInterfaceAndReleaseStream(): Arabirim yalnızca bir kez iptal olabilir, bu yöntemi kullanmanın tek olumsuz yanı ise. Diğer bir deyişle, aynı nesne için birkaç STA iş parçacığı erişmeniz gerekirse, bu yöntem çalışmaz.
  2. CoMarshalInterface() ve CoUnMarshalInterface(): Arabirim kez çağrılamadı ve MSHLFLGS_TABLEWEAK veya MSHLFLGS_TABLESTRONG arabirimi sıralama yaparken belirten sayıda, arabirimi gibi; örneğin, unmarshal bu yöntem daha esnektir. Ancak ıstream oluşturmak, işaretçiyi arama ve sıralama paket CoReleaseMarshalData() aracılığıyla temizlemek sahip olduğu aynı zamanda daha fazla kod gerektirir. Işaretçileri için bir proxy sıralama yaparken, Windows NT 4.0 Service Pack 4 veya sonraki sürümleri, Windows 98 veya Windows 95'in DCOM 1.2 veya daha sonra yüklenmiş olmalıdır. Ayrıca MSHLFLGS_TABLESTRONG kullanarak bayrak, Windows 2000 veya sonrası olması gerekir.
  3. Genel arabirim Table(GIT): The GIT bir STA iş parçacığı bir arabirim saklamak ve başka bir STA iş parçacığı kendi proxy'sine erişmesini sağlayan bir COM nesnesidir. Bu, yalnızca Windows NT 4.0 Service Pack 3 sonrası, Windows 98 veya Windows 95 DCOM 1.1 ile birlikte veya üstü yüklü vardır.
Marshal.exe, ana proje TSTMARSH içerir. Bu, ITest uygulayan bir ATL EXE sunucusu içerir. ITest dizeyi büyük harfe dönüştürür; ToUpper() adlı bir yöntem var. Istemci adı verilen BIR sub-project de bulunmaktadır. Burada gösterilen tüm sıralama ve unmarshaling yöntemleri Client.cpp olur. Her yöntemi <a0>test</a0> nesnesinin bir örneğini oluşturur, marshals bir ITest, arabirim ve bir iş parçacığı oluşturur. Her iş parçacığı ITest arabirim iptal ve yöntem bir dize dönüştürülmeye ToUpper() olarak adlandırılır. <a1>Debug</a1> penceresinde çıktı görmelisiniz: "iş PARÇACıĞıNDAN BUNU OUTPUT # N".

Referanslar

Daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
172314  (http://support.microsoft.com/kb/172314/ ) RPC_E_WRONG_THREAD hata açıklaması

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
Anahtar Kelimeler: 
kbmt kbsweptvs2008 kbarchitecture kbfile kbhowto kbsample kbthread KB206076 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:206076  (http://support.microsoft.com/kb/206076/en-us/ )