Thông tin: Mô t? và ho?t đ?ng c?a OLE lu?ng mô h?nh

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 150777
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

COM các đ?i tư?ng có th? đư?c s? d?ng trong nhi?u ch? đ? c?a m?t quá tr?nh. Các đi?u kho?n "Single- lu?ng căn h?"(STA) và"Multi-threaded căn h?"(MTA) đang đư?c s? d?ng đ? t?o m?t khuôn kh? khái ni?m cho mô t? m?i quan h? gi?a các đ?i tư?ng và ch? đ?, các m?i quan h? concurrency trong s? các đ?i tư?ng, các phương ti?n b?ng phương pháp mà các cu?c g?i đư?c chuy?n giao cho m?t đ?i tư?ng, và các quy t?c cho đi qua giao di?n con tr? trong s? các ch? đ?. Các thành ph?n và khách hàng c?a h? ch?n gi?a sau hai căn h? ki?u hi?n nay đư?c h? tr? b?i COM:

  1. Đ?a đơn-ren căn h? mô h?nh (STA): m?t ho?c nhi?u ch? đ? c?a m?t quá tr?nh s? d?ng COM và các cu?c g?i cho các đ?i tư?ng COM đư?c đ?ng b? hóa b?i COM. Interfaces là marshaled gi?a ch? đ?. M?t trư?ng h?p thoái hóa đơn-ren mô h?nh căn h? chung cư, nơi ch? m?t thread trong m?t quá tr?nh đư?c đưa ra s? d?ng COM, là đư?c g?i là mô h?nh lu?ng đơn. Trư?c đó Microsoft thông tin và tài li?u hư?ng d?n có đôi khi g?i STA m?u đơn gi?n là các "căn h? ki?u."
  2. Đa lu?ng căn h? ki?u (MTA): ch? đ? c?a m?t ho?c nhi?u s? d?ng COM và các cu?c g?i cho các đ?i tư?ng COM g?n li?n v?i MTA đư?c th?c hi?n tr?c ti?p b?i t?t c? ch? đ? liên quan đ?n MTA mà không có b?t k? interposition h? th?ng m? gi?a ngư?i g?i và đ?i tư?ng. V? nhi?u khách hàng đ?ng th?i có th? kêu g?i các đ?i tư?ng nhi?u hơn ho?c ít hơn cùng m?t lúc (đ?ng th?i nhi?u h? th?ng), các đ?i tư?ng ph?i đ?ng b? hóa t?nh tr?ng n?i b? c?a h? b?i b?n thân m?nh. Giao di?n không đư?c marshaled gi?a ch? đ?. Trư?c đó Microsoft thông tin và tài li?u đôi khi g?i đ?n đây mô h?nh như "mi?n phí-ren m?u."
  3. C? hai mô h?nh STA và mô h?nh MTA có th? đư?c s? d?ng trong quá tr?nh. Đi?u này đôi khi đư?c g?i là m?t quá tr?nh "tr?n-ngư?i m?u".
MTA đư?c gi?i thi?u trong NT 4.0 và có s?n trong Windows 95 v?i DCOM95. Các mô h?nh STA t?n t?i trong Windows NT 3.51 và Windows 95 c?ng như NT 4.0 và Windows 95 v?i DCOM95.

THÔNG TIN THÊM

T?ng quan

Các Model threading COM cung c?p cơ ch? cho các thành ph?n mà s? d?ng ki?n trúc threading khác nhau đ? làm vi?c v?i nhau. H? c?ng cung c?p đ?ng b? hóa d?ch v? cho các thành ph?n đ?i h?i h?. Ví d?, m?t đ?i tư?ng c? th? có th? đư?c thi?t k? đ? đư?c g?i là ch? b?i m?t thread duy nh?t và có th? không đ?ng b? hóa đ?ng th?i các cu?c g?i t? khách hàng. N?u m?t đ?i tư?ng là đư?c g?i là đ?ng th?i b?i nhi?u ch? đ?, nó treo ho?c gây ra l?i. COM cung c?p cơ ch? đ? đ?i phó v?i này kh? năng tương tác c?a lu?ng ki?n trúc.

Các thành ph?n ngay c? nh?n th?c đư?c s?i thư?ng c?n d?ch v? đ?ng b? hóa. Cho Ví d?, các thành ph?n có m?t ngư?i dùng đ? h?a giao di?n (GUI), ch?ng h?n như OLE/đi?u khi?n ActiveX, embeddings ho?t đ?ng t?i ch?, và các văn b?n ActiveX, c?n ph?i đ?ng b? hóa và đăng thư?ng k? trên cu?c g?i COM và c?a s? tin nh?n. COM cung c?p các d?ch v? đ?ng b? hóa đ? các thành ph?n này có th? b?ng văn b?n mà không có đ?ng b? hóa ph?c t?p m?.

M?t căn h?"" có m?t vài khía c?nh đ?a. Trư?c tiên, nó là m?t h?p l? xây d?ng cho suy ngh? v? concurrency, ch?ng h?n như cách ch? đ? liên quan đ?n m?t t?p các đ?i tư?ng COM. Th? hai, nó là m?t t?p các quy t?c l?p tr?nh viên ph?i tuân theo đ? nh?n đư?c hành vi concurrency mà h? mong đ?i t? môi trư?ng COM. Cu?i cùng, nó là h? th?ng cung c?p m? s? đó giúp các l?p tr?nh viên qu?n l? ch? đ? concurrency Đ?i v?i các đ?i tư?ng COM.

Thu?t ng? "căn h?" xu?t phát t? m?t ?n d? trong đó m?t quá tr?nh đư?c h?nh thành như m?t th?c th? hoàn toàn r?i r?c, ví d? như m?t "xây d?ng" có ngh?a là chia ra m?t t?p h?p các mi?n đ?a phương có liên quan, nhưng khác nhau "c?" đư?c g?i là "căn h? chung cư." M?t căn h? là m?t "h?p l? container" t?o ra m?t liên k?t gi?a các đ?i tư?ng và, trong m?t s? trư?ng h?p, ch? đ?. Ch? đ? không ph?i là căn h?, m?c dù có th? có m?t đ?a đơn ch? đ? m?t cách h?p l? liên quan đ?n m?t căn h? trong các mô h?nh STA. Các đ?i tư?ng không căn h?, m?c dù m?i đ?i tư?ng đư?c k?t h?p v?i m?t và ch? có m?t căn h?. Nhưng các căn h? là nhi?u hơn là ch? m?t h?p l? xây d?ng; quy t?c c?a h? mô t? hành vi c?a h? th?ng COM. Nếu quy t?c c?a các mô h?nh căn h? không đư?c theo sau, COM các đ?i tư?ng s? không ho?t đ?ng đúng.

Thêm chi ti?t

M?t căn h? đơn-ren (STA) là m?t t?p các đ?i tư?ng COM g?n li?n v?i m?t ch? đ? c? th?. Các đ?i tư?ng có liên quan đ?n căn h? c?a đang t?o b?i các ch? đ?, ho?c chính xác hơn, đang đư?c đ?u tiên ti?p xúc v?i COM h? th?ng (thông thư?ng b?i marshaling) trên các ch? đ?. M?T STA đư?c coi là m?t đ?t trong trư?ng h?p m?t đ?i tư?ng ho?c m?t proxy "cu?c s?ng." N?u đ?i tư?ng ho?c ?y quy?n c?n ph?i đư?c truy c?p b?i căn h? khác (trong cùng m?t ho?c m?t quá tr?nh khác nhau), c?a nó giao di?n con tr? ph?i đư?c marshaled đ?n căn h? đó nơi m?t proxy m?i là t?o. N?u các quy t?c c?a các mô h?nh căn h? đư?c theo sau, không có tr?c ti?p cu?c g?i t? các ch? đ? c?a quá tr?nh đư?c phép trên đ?i tư?ng đó; mà s? vi ph?m các quy t?c mà t?t c? các đ?i tư?ng trong m?t căn h? cho ch?y trên m?t ch? đ? duy nh?t. Các quy t?c t?n t?i b?i v? h?u h?t m? ch?y trong m?t STA s? không ho?t đ?ng đúng n?u ch?y trên ch? đ? c?a b? sung.

Các ch? đ? liên quan đ?n m?t STA ph?i g?i CoInitialize ho?c CoInitializeEx (NULL, COINIT_APARTMENTTHREADED) và ph?i l?y l?i và G?i tin nh?n c?a c?a s? cho các đ?i tư?ng liên quan đ?n nh?n đư?c g?i đ?n các cu?c g?i. COM công văn và đ?ng b? hoá các cu?c g?i cho các đ?i tư?ng trong m?t STA b?ng cách s? d?ng c?a s? thư, như đư?c di?n t? sau này trong bài vi?t này.

"Chính STA" là ch? đ? mà các cu?c g?i CoInitialize ho?c CoInitializeEx(NULL,COINIT_APARTMENTTHREADED) l?n đ?u tiên trong m?t quá tr?nh nh?t đ?nh. STA chính c?a m?t quá tr?nh ph?i c?n l?i s?ng cho đ?n khi t?t c? COM công vi?c đ? hoàn t?t b?i v? có m?t s? đ?i tư?ng trong proc luôn luôn t?i trong STA chính, như miêu t? sau này trong bài vi?t này.

Windows NT 4.0 và DCOM95 gi?i thi?u m?t lo?i m?i c?a căn h? đư?c g?i là các đa lu?ng căn h? (MTA). M?t MTA là m?t t?p các đ?i tư?ng COM liên k?t v?i m?t t?p h?p các ch? đ? trong quá tr?nh như v?y là b?t k? thread có th? g?i b?t k? đ?i tư?ng th?c hi?n tr?c ti?p mà không c?n interposition h? th?ng m?. Giao di?n con tr? đ?n b?t k? đ?i tư?ng trong MTA có th? đư?c thông qua trong s? các ch? đ? liên k?t v?i MTA mà không c?n ph?i đư?c marshaled. Ch? đ? trong các quá tr?nh g?i CoInitializeEx (NULL, COINIT_MULTITHREADED) đư?c liên k?t v?i MTA. Không gi?ng như STA mô t? ? trên, các ch? đ? c?a m?t MTA không c?n ph?i l?y l?i và g?i tin nh?n c?a c?a s? cho các đ?i tư?ng liên quan đ?n nh?n đư?c cu?c g?i đ?n. COM không đ?ng b? các cu?c g?i cho các đ?i tư?ng trong m?t MTA. Các đ?i tư?ng trong m?t MTA ph?i b?o v? nhà nư?c bên trong c?a h? t? tham nh?ng b?ng s? tương tác c?a nhi?u đ?ng th?i đ? và h? không th? làm cho b?t k? các gi? đ?nh v? n?i dung c?a Thread-C?c lưu tr? c?n l?i không đ?i gi?a các phương pháp khác nhau invocations.

M?t quá tr?nh có th? có b?t k? s? nào c?a STAs, nhưng, nhi?u nh?t, có th? có m?t MTA. Các MTA bao g?m m?t ho?c nhi?u ch? đ?. STAs có m?t s?i m?i. M?t ch? đ? thu?c v?, t?i đa, m?t trong nh?ng căn h?. Các đ?i tư?ng thu?c v? m?t và ch? m?t căn h?. Giao di?n con tr? nên luôn luôn đư?c marshaled gi?a các căn h? (m?c dù k?t qu? c?a marshaling có th? là m?t con tr? tr?c ti?p thay v? m?t ?y quy?n). Xem thông tin dư?i đây trên CoCreateFreeThreadedMarshaler.

M?t quá tr?nh l?a ch?n m?t trong các mô h?nh threading đư?c cung c?p b?i COM. M?t mô h?nh STA quá tr?nh này có m?t ho?c nhi?u STAs và không có m?t MTA. M?t quá tr?nh mô h?nh MTA có m?t MTA v?i ch? đ? c?a m?t ho?c nhi?u và không có b?t k? STAs. M?t h?n h?p- quá tr?nh mô h?nh có m?t MTA và b?t k? s? nào c?a STAs.

Đ?a đơn-ren căn h? m?u

Các ch? đ? c?a m?t STA ph?i g?i CoInitialize ho?c CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) và ph?i l?y và g?i kh?n c?p c?a s? tin nh?n b?i v? COM s? d?ng c?a s? tin nh?n đ? đ?ng b? hóa và g?i kh?n c?p vi?c phân ph?i các cu?c g?i cho m?t đ?i tư?ng trong mô h?nh này. Xem ph?n tham kh?o bên dư?i cho bi?t thêm thông tin.

Máy ch? mô h?nh đó STA h? tr?:

Trong mô h?nh STA, các cu?c g?i đ?n m?t đ?i tư?ng đư?c đ?ng b? hóa b?i COM trong cùng m?t cách như c?a s? tin nh?n g?i đ?n m?t c?a s? đư?c đ?ng b? hóa. Các cu?c g?i g?i b?ng cách s? d?ng c?a s? tin nh?n đ?n các ch? đ? mà t?o ra các đ?i tư?ng. Do v?y, ch? đ? c?a đ?i tư?ng ph?i g?i Get/PeekMessage và DispatchMessage đ? nh?n các cu?c g?i. COM t?o ra m?t c?a s? ?n liên k?t v?i m?i STA. M?t cu?c g?i đ?n m?t đ?i tư?ng t? bên ngoài STA đư?c chuy?n giao b?i Th?i gian ch?y COM vào ch? đ? c?a đ?i tư?ng b?ng cách s? d?ng m?t c?a s? thư đăng này ?n c?a s?. Khi các ch? đ? liên k?t v?i các đ?i tư?ng STA truy và công văn thư, th? t?c c?a s? cho c?a s? ?n, c?ng đư?c th?c hi?n b?i COM, nh?n đư?c nó. Th? t?c c?a s? đư?c s? d?ng b?i các Th?i gian ch?y COM đ? "treo" s?i ch? g?n li?n v?i STA v? COM th?i gian ch?y trên c? hai m?t c?a cu?c g?i t? thread COM thu?c s? h?u c?a STA ch? đ?. COM runtime (bây gi? ch?y trong ch? đ? c?a STA) g?i "lên" thông qua m?t COM cung c?p khai thành phương pháp giao di?n tương ?ng c?a đ?i tư?ng. Đư?ng d?n th?c hi?n tr? l?i t? cu?c g?i phương th?c đ?o ngư?c "lên" g?i; các cu?c g?i tr? l?i xu?ng khai và th?i gian ch?y COM, đi ki?m soát Quay l?i ch? đ? runtime COM thông qua m?t c?a s? tin nh?n, mà sau đó tr? v? thông qua các kênh COM đ? ngư?i g?i g?c.

Khi nhi?u khách hàng g?i cho m?t đ?i tư?ng STA, các cu?c g?i s? t? đ?ng X?p hàng đ?i trong hàng đ?i tin nh?n b?ng vi?c chuy?n giao các cơ ch? ki?m soát đư?c s? d?ng trong STA. Các đ?i tư?ng s? nh?n đư?c m?t cu?c g?i m?i khi STA c?a nó l?y và công văn thư. B?i v? các cu?c g?i đư?c đ?ng b? hóa b?i COM ? đây cách, và b?i v? các cu?c g?i luôn đư?c phân ph?i trên thread duy nh?t liên h? v?i các đ?i tư?ng STA, tri?n khai giao di?n c?a đ?i tư?ng làm không c?n ph?i cung c?p đ?ng b? hóa.

LƯU ?: Các đ?i tư?ng có th? đư?c b?t n?u m?t phương pháp giao di?n th?c hi?n truy và công văn thư trong khi x? l? m?t phương pháp g?i, gây ra m?t cu?c g?i đ? đư?c giao cho đ?i tư?ng c?a cùng m?t STA. Một thông thư?ng trong cách mà đi?u này x?y ra là n?u m?t đ?i tư?ng STA làm cho m?t out-going (qua căn h?/cross-tr?nh) g?i b?ng cách s? d?ng com Đây là gi?ng h?t nhau đ? các cách th?c mà trong đó m?t th? t?c c?a s? có th? đư?c b?t n?u nó l?y và công văn thư trong khi x? l? m?t tin nh?n. COM không ngăn ch?n re- l?i vào trên cùng m?t s?i nhưng ngăn ch?n đ?ng th?i th?c hi?n. Nó c?ng cung c?p m?t phương ti?n mà liên quan đ?n COM reentrancy có th? qu?n l?. Xem tài li?u tham kh?o ph?n dư?i đây cho bi?t thêm thông tin. Không ph?i là đ?i tư?ng re- nh?p n?u vi?c tri?n khai phương pháp không g?i ra kh?i căn h? c?a m?nh ho?c N?u không truy xu?t và g?i tin nh?n.

Khách hàng ch?u trách nhi?m trong mô h?nh STA:

Khách hàng m? ch?y trong m?t quá tr?nh và/ho?c s?i mà s? d?ng các mô h?nh STA ph?i th?ng ch? giao di?n c?a m?t đ?i tư?ng gi?a căn h? b?ng cách s? d?ng CoMarshalInterThreadInterfaceInStream và CoGetInterfaceAndReleaseStream. Ví d?, n?u căn h? 1 trong các khách hàng có m?t con tr? giao di?n, và Căn h? 2 yêu c?u s? d?ng c?a nó, căn h? 1 ph?i nguyên soái giao di?n b?ng cách s? d?ng CoMarshalInterThreadInterfaceInStream. Đ?i tư?ng d?ng tr? l?i b?i ch?c năng này là ch? đ?-an toàn và con tr? giao di?n c?a nó nên đư?c lưu tr? trong m?t b? nh? tr?c ti?p bi?n có th? truy c?p b?i 2 căn h?. Căn h? 2 ph?i vư?t qua giao di?n d?ng này đ? CoGetInterfaceAndReleaseStream đ? unmarshal các giao di?n trên đ?i tư?ng ti?m ?n và l?y l?i m?t con tr? đ?n m?t proxy qua đó, nó có th? truy c?p các đ?i tư?ng.

Căn h? chính c?a m?t quá tr?nh nh?t đ?nh nên v?n c?n s?ng cho đ?n khi khách hàng đ? hoàn thành t?t c? COM công vi?c b?i v? m?t s? đ?i tư?ng trong proc đư?c n?p trong các chính-căn h?. (Thêm chi là chi ti?t dư?i đây).

Đa lu?ng căn h? m?u

M?t MTA là b? sưu t?p c?a các đ?i tư?ng t?o ho?c ti?p xúc c?a t?t c? các ch? đ? trong quá tr?nh đ? g?i là CoInitializeEx (NULL, COINIT_MULTITHREADED).

LƯU ?: Current hi?n th?c c?a COM cho phép m?t s?i mà không m?t cách r? ràng kh?i t?o COM là m?t ph?n c?a MTA. M?t ch? đ? mà không initialize COM là m?t ph?n c?a MTA ch? khi nó b?t đ?u b?ng cách s? d?ng COM sau lúc ít nh?t là m?t trong nh?ng khác thread trong quá tr?nh trư?c đây g?i là CoInitializeEx (NULL, COINIT_MULTITHREADED). (Th?m chí có th? r?ng COM kh?i t?o chính nó có th? có đư?c MTA khi không có ch? đ? khách hàng có m?t cách r? ràng làm như v?y; Ví d?, m?t ch? đ? liên quan đ?n m?t STA cu?c g?i CoGetClassObject/CoCreateInstance [ví d?] ngày m?t CLSID đư?c đánh d?u "ThreadingModel = t? do" và COM ng?m t?o m?t MTA vào đó các đ?i tư?ng l?p đư?c t?i.) Xem thông tin trên lu?ng mô h?nh kh? năng tương tác dư?i đây.

Tuy nhiên, đây là m?t c?u h?nh có th? gây ra v?n đ?, ch?ng h?n như truy c?p vào hành vi vi ph?m, trong nh?ng trư?ng h?p nh?t đ?nh. V? v?y, nó là m?nh m? khuy?n cáo r?ng m?i ch? đ? có nhu c?u đ? làm công vi?c COM kh?i t?o COM b?i g?i CoInitializeEx và sau đó, sau khi hoàn t?t công vi?c COM, g?i CoUninitialize. Chi phí không c?n "thi?t" kh?i t?o m?t MTA là t?i thi?u.

Ch? đ? c?a MTA không c?n ph?i l?y l?i và g?i thư v? COM nào không s? d?ng c?a s? thư trong mô h?nh này đ? cung c?p các cu?c g?i đ?n m?t đ?i tư?ng.

H? ph?c v? h? tr? mô h?nh MTA:

Trong mô h?nh MTA, các cu?c g?i đ?n m?t đ?i tư?ng đang không đư?c đ?ng b? b?i COM. Multiple khách hàng có th? đ?ng th?i g?i cho m?t đ?i tư?ng h? tr? mô h?nh này ngày ch? đ? khác nhau, và các đ?i tư?ng ph?i cung c?p đ?ng b? hóa trong c?a nó giao di?n/phương pháp tri?n khai s? d?ng đ?ng b? hóa các đ?i tư?ng như các s? ki?n, mutexes, semaphores, vv. MTA các đ?i tư?ng có th? nh?n đư?c cu?c g?i đ?ng th?i t? nhi?u khách hàng ra quá tr?nh thông qua m?t h? bơi c?a COM t?o ch? đ? thu?c v? quá tr?nh c?a đ?i tư?ng. MTA các đ?i tư?ng có th? nh?n đư?c cu?c g?i đ?ng th?i t? nhi?u khách hàng trong quá tr?nh trên nhi?u ch? đ? liên k?t v?i các MTA.

Khách hàng ch?u trách nhi?m trong mô h?nh MTA:

Khách hàng m? ch?y trong m?t quá tr?nh và/ho?c s?i mà s? d?ng các mô h?nh MTA nào không có đ? marshal con tr? giao di?n c?a m?t đ?i tư?ng gi?a chính nó và các ch? đ? khác c?a MTA. Thay vào đó, m?t MTA s?i có th? s? d?ng m?t con tr? giao di?n thu đư?c t? ch? đ? MTA khác như m?t con tr? b? nh? tr?c ti?p. Khi m?t khách hàng ch? đ? làm cho m?t cu?c g?i đ?n m?t đ?i tư?ng ra quá tr?nh, nó đ?nh ch? cho đ?n khi cu?c g?i đ? hoàn thành. Các cu?c g?i có th? đ?n nơi trên các đ?i tư?ng liên quan đ?n MTA trong khi t?t c? các ?ng d?ng t?o ch? đ? liên quan đ?n MTA đang b? ch?n trên ra- các cu?c g?i đi. Trong trư?ng h?p này và nói chung, các cu?c g?i đư?c chuy?n giao vào ch? đ? đư?c cung c?p b?i COM runtime. Thư b? l?c (IMessageFilter) không có s?n đ? s? d?ng trong các mô h?nh MTA.

Mô h?nh h?n h?p phân lu?ng

M?t quá tr?nh có h? tr? các mô h?nh h?n h?p phân lu?ng s? s? d?ng m?t MTA và m?t ho?c thêm STAs. Giao di?n con tr? ph?i đư?c marshaled gi?a t?t c? các căn h? nhưng có th? đư?c s? d?ng mà không có marshaling trong MTA. Các cu?c g?i cho các đ?i tư?ng trong m?t STA đư?c đ?ng b? hóa b?i COM ch?y trên ch? m?t thread trong khi các cu?c g?i đ?n không có các đ?i tư?ng trong MTA. Tuy nhiên, g?i t? m?t STA đ? m?t MTA b?nh thư?ng đi qua h? th?ng cung c?p m? và chuy?n sang from@MSN.com STA thread m?t MTA ch? đ? trư?c khi đư?c giao cho các đ?i tư?ng.

LƯU ?: Xem tài li?u SDK vào CoCreateFreeThreadedMarshaler() và các th?o lu?n r?ng API dư?i đây đ? bi?t thông tin v? trư?ng h?p nơi tr?c ti?p con tr? có th? đư?c s? d?ng, và làm th? nào m?t s?i STA có th? g?i tr?c ti?p vào m?t đ?i tư?ng đ?u tiên liên k?t v?i MTA, và ngư?c l?i, t? nhi?u căn h?.

Vi?c l?a ch?n các mô h?nh Threading

M?t thành ph?n có th? ch?n đ? h? tr? các mô h?nh STA, MTA m?u, ho?c m?t s? k?t h?p c?a hai b?ng cách s? d?ng mô h?nh lu?ng h?n h?p. Ví d?, m?t đ?i tư?ng nào r?ng r?i I/O có th? ch?n đ? h? tr? MTA đ? cung c?p t?i đa đáp ?ng cho khách hàng b?ng cách cho phép giao di?n cu?c g?i đư?c th?c hi?n trong I/O đ? tr?. Ngoài ra, m?t v?t th? tương tác v?i ngư?i s? d?ng h?u như luôn luôn ch?n đ? h? tr? STA đ? đ?ng b? các cu?c g?i đ?n COM v?i c?a nó GUI ho?t đ?ng. H? tr? các mô h?nh STA là d? dàng hơn v? COM cung c?p đ?ng b? hóa. H? tr? các mô h?nh MTA là khó khăn hơn v? các đ?i tư?ng ph?i th?c hi?n đ?ng b? hóa, nhưng đ? đáp ?ng v?i khách hàng là t?t hơn b?i v? đ?ng b? hóa đư?c s? d?ng cho ph?n nh? hơn c?a m?, thay v? cho các cu?c g?i toàn b? giao di?n đư?c cung c?p b?i COM.

Các mô h?nh STA c?ng đư?c s? d?ng b?i Microsoft giao d?ch Server (MTS, trư?c đây có tên m? "Viper"), và v? th? DLL d?a trên v?t l?p k? ho?ch đ? ch?y trong các MTS môi trư?ng nên s? d?ng các mô h?nh STA. Các đ?i tư?ng th?c hi?n cho MTA mô h?nh s? thư?ng làm vi?c t?t trong m?t môi trư?ng MTS. Tuy nhiên, h? s? ch?y ít hi?u qu? b?i v? h? s? s? d?ng ch? đ? không c?n thi?t đ?ng b? hóa nguyên th?y.

Đánh d?u các mô h?nh h? tr? phân lu?ng c?a máy ch? trong Proc

M?t ch? đ? s? d?ng mô h?nh MTA n?u nó g?i CoInitializeEx(NULL, COINIT_MULTITHREADED) ho?c s? d?ng COM mà không đang kh?i t?o nó. S? d?ng m?t s?i các mô h?nh STA n?u nó g?i CoInitialize ho?c CoInitializeEx(NULL, COINIT_APARTMENTTHREADED).

Các API CoInitialize cung c?p ki?m soát căn h? cho khách hàng m? và cho các đ?i tư?ng đư?c đóng gói trong.Emerge, v? th?i gian ch?y COM kh?i đ?ng m? có th? kh?i t?o COM trong th?i trang mong mu?n.

Tuy nhiên, m?t máy ch? trong-proc (DLL d?a) COM không g?i CoInitialize/CoInitializeEx v? nh?ng API s? có đư?c g?i là do các th?i gian máy ch? DLL đư?c n?p. Do đó, m?t máy ch? DLL ph?i s? d?ng các đăng k? đ? thông báo cho COM c?a mô h?nh threading nó h? tr? đ? các COM có th? đ?m b?o r?ng h? th?ng ho?t đ?ng trong m?t cách đó là tương thích v?i nó. Một tên là giá tr? c?a các thành ph?n CLSID\InprocServer32 phím g?i là ThreadingModel đư?c s? d?ng cho m?c đích này như sau:

  • ThreadingModel không có giá tr?: h? tr? mô h?nh lu?ng đơn.
  • ThreadingModel = căn h?: h? tr? STA mô h?nh.
  • ThreadingModel = c? hai: h? tr? STA và MTA mô h?nh.
  • ThreadingModel = t? do: h? tr? ch? MTA.
LƯU ?: ThreadingModel là m?t giá tr? đư?c đ?t tên, không m?t subkey InprocServer32 như không chính xác trong tài li?u m?t s? phiên b?n trư?c c?a tài li?u Win32.

Threading mô h?nh c?a máy ch? trong proc đư?c th?o lu?n sau này trong bài vi?t này. N?u m?t máy ch? trong proc cung c?p nhi?u lo?i c?a các đ?i tư?ng (m?i đ?c đáo riêng c?a m?nh CLSID), m?i lo?i có th? có m?t giá tr? ThreadingModel khác nhau. Trong khác t?, các mô h?nh threading là trên m?t CLSID, không cho m?i m? gói/DLL. Tuy nhiên, m?c nh?p API ch? c?n thi?t đ? "đi" và truy v?n trong proc t?t c? máy ch? (DLLGetClassObject(), DLLCanUnloadNow()) ph?i là ch? đ? an toàn cho b?t k? máy ch? trong proc h? tr? nhi?u ch? đ? (có ngh?a là m?t ThreadingModel giá tr? c?a căn h?, c?, ho?c t? do).

Như đ? nói trư?c đây, ra quá tr?nh máy ch? không đánh d?u m?nh b?ng cách s? d?ng giá tr? ThreadingModel. Thay vào đó, h? s? d?ng CoInitialize ho?c CoInitializeEx. DLL d?a trên máy ch? có th? mong đ?i đ? ch?y ra quá tr?nh b?ng cách s? d?ng "thay th?" ch?c năng COM (ch?ng h?n như h? th?ng cung c?p bà DLLHOST.EXE) ch? c?n làm theo các quy t?c cho DLL d?a trên các máy ch?; không có không có đ?c bi?t cân nh?c trong trư?ng h?p đó.

Khi khách hàng và đ?i tư?ng s? d?ng mô h?nh lu?ng khác nhau

Tương tác gi?a m?t khách hàng và m?t đ?i tư?ng ra c?a quá tr?nh là th?ng chuy?n ti?p ngay c? khi mô h?nh threading khác nhau đư?c s? d?ng b?i v? khách hàng và đ?i tư?ng đang trong quá tr?nh khác nhau và COM là có liên quan trong qua cu?c g?i t? các khách hàng đ? đ?i tư?ng. B?i v? COM interposed gi?a các khách hàng và các máy ch?, nó cung c?p m? cho interoperation c?a các lu?ng các mô h?nh. Ví d?, n?u m?t đ?i tư?ng STA đư?c g?i là đ?ng th?i b?i nhi?u STA ho?c MTA khách hàng, COM đ?ng b? các cu?c g?i b?ng cách đ?t tương ?ng c?a s? thư trong hàng đ?i tin nh?n c?a máy ch?. Nh?n đư?c các đ?i tư?ng STA m?t cu?c g?i m?i khi nó l?y và công văn thư. K?t h?p t?t c? mô h?nh lu?ng kh? năng tương tác cho phép và hoàn toàn đư?c h? tr? gi?a khách hàng và các đ?i tư?ng ra c?a quá tr?nh.

Tương tác gi?a m?t khách hàng và m?t đ?i tư?ng trong proc s? d?ng khác nhau lu?ng mô h?nh là ph?c t?p hơn. M?c dù các máy ch? là ?-proc, COM ph?i interpose chính nó gi?a khách hàng và đ?i tư?ng trong m?t s? trư?ng h?p. Cho Ví d?, m?t đ?i tư?ng trong proc đư?c thi?t k? đ? h? tr? các mô h?nh STA có th? đư?c g?i là đ?ng th?i b?i nhi?u ch? đ? c?a m?t khách hàng. COM không th? cho phép khách hàng ch? đ? tr?c ti?p truy c?p vào giao di?n c?a đ?i tư?ng v? các đ?i tư?ng không ph?i là đư?c thi?t k? cho truy c?p đ?ng th?i. Thay vào đó, COM ph?i đ?m b?o r?ng các cu?c g?i đang đ?ng b? hóa và th?c hi?n ch? b?i các ch? đ? liên quan đ?n STA mà "có" đ?i tư?ng. B?t ch?p s? ph?c t?p nh?t, t?t c? t? h?p mô h?nh lu?ng kh? năng tương tác đư?c phép gi?a khách hàng và trong proc các đ?i tư?ng.

Lu?ng các mô h?nh trong Out c?a quá tr?nh (d?a trên EXE) máy ch?

Sau đây là ba lo?i ra quá tr?nh máy ch?, m?i trong s? đó có th? đư?c s? d?ng b?i b?t k? khách hàng COM b?t k? c?a threading m?u đư?c s? d?ng b?i mà khách hàng:

  1. STA Model Server:

    H? ph?c v? nào COM làm vi?c trong m?t ho?c nhi?u STAs. Các cu?c g?i đ?ng b? hóa b?i COM và cung c?p b?i các ch? đ? liên quan đ?n STA mà các đ?i tư?ng đư?c t?o ra. Các cu?c g?i phương th?c l?p-nhà máy đang G?i b?i s?i ch? g?n li?n v?i STA đăng k? các l?p nhà máy. Các đ?i tư?ng và nhà máy s?n xu?t l?p h?c không c?n ph?i th?c hi?n đ?ng b? hóa. Tuy nhiên, th?c s? ph?i đ?ng b? hóa quy?n truy c?p vào b?t k? bi?n toàn c?u đư?c s? d?ng b?i nhi?u STAs. H? ph?c v? ph?i s? d?ng CoMarshalInterThreadInterfaceInStream và CoGetInterfaceAndReleaseStream đ? marshal g?i ? giao di?n, có th? t? các máy ch? khác, gi?a STAs. H? ph?c v? tùy ch?n có th? th?c hi?n IMessageFilter trong m?i STA đ? ki?m soát các khía c?nh c?a cu?c g?i giao b?i COM. M?t trư?ng h?p thoái hóa là các đ?a đơn phân lu?ng model rack server mà làm công vi?c COM trong m?t STA.
  2. MTA Model Server:

    H? ph?c v? nào COM làm vi?c trong m?t ho?c nhi?u ch? đ?, t?t c? đ?u thu?c v? MTA. Các cu?c g?i không đ?ng b? hóa b?i com COM t?o ra m?t h? bơi c?a ch? đ? c?a h? ph?c v? x? l?, và m?t cu?c g?i khách hàng đư?c phân ph?i b?i b?t k? các ch? đ?. Ch? đ? không ph?i l?y l?i và g?i tin nh?n. Đ?i tư?ng và l?p nhà máy ph?i th?c hi?n đ?ng b? hóa. H? ph?c v? không c?n đ? marshal con tr? giao di?n gi?a các ch? đ?.
  3. H?n h?p mô h?nh máy ch?:

    Xem ph?n trong bài vi?t này có tiêu đ? "mô h?nh h?n h?p phân lu?ng" đ? bi?t thêm thông tin.

Lu?ng các mô h?nh trong các khách hàng

Có ba lo?i c?a khách hàng:

  1. STA mô h?nh khách hàng:

    Khách hàng nào COM làm vi?c trong ch? đ? liên k?t v?i m?t ho?c nhi?u STAs. Khách hàng ph?i s? d?ng CoMarshalInterThreadInterfaceInStream và CoGetInterfaceAndReleaseStream đ? th?ng ch? giao di?n con tr? gi?a STAs. M?t trư?ng h?p thoái hóa là lu?ng đơn mô h?nh khách hàng mà không COM làm vi?c trong m?t STA. Ch? đ? c?a khách hàng vào m?t COM cung c?p tin nh?n v?ng l?p khi nó làm cho m?t cu?c g?i đi. Khách hàng có th? s? d?ng IMessageFilter đ? qu?n l? callbacks và x? l? c?a c?a s? thư trong khi ch? đ?i Euro cu?c g?i và các v?n đ? concurrency.
  2. MTA mô h?nh khách hàng:

    Khách hàng nào COM làm vi?c trong m?t ho?c nhi?u ch? đ?, t?t c? đ?u thu?c v? MTA. Khách hàng không c?n đ? marshal con tr? giao di?n gi?a ch? đ? c?a nó. Khách hàng không th? s? d?ng IMessageFilter. Ch? đ? c?a khách hàng đ?nh ch? khi h? làm cho m?t cu?c g?i COM v?i m?t đ?i tư?ng ra quá tr?nh và h? sơ khi tr? v? cu?c g?i. Các cu?c g?i đ?n vào COM-t?o và ch? đ? c?a qu?n l?.
  3. Mô h?nh h?n h?p khách hàng:

    Xem ph?n trong bài vi?t này có tiêu đ? "mô h?nh h?n h?p phân lu?ng" đ? bi?t thêm thông tin.

Lu?ng các mô h?nh trong trong-proc (DLL d?a) máy ch?:

Có b?n lo?i c?a máy ch? trong proc, m?i trong s? đó có th? đư?c s? d?ng b?i b?t k? khách hàng COM b?t k? c?a threading m?u đư?c s? d?ng b?i khách hàng đó. Tuy nhiên, các máy ch? trong proc ph?i cung c?p cho tàn m? cho b?t k? tu? (không- h? th?ng đ?nh ngh?a) giao di?n h? th?c hi?n n?u chúng đ? h? tr? phân lu?ng Salon ki?u kh? năng c?ng tác v? đó thư?ng đ?i h?i r?ng nguyên soái COM các giao di?n gi?a các khách hàng căn h?. B?n lo?i là:

  1. Trong proc Server h? tr? duy nh?t threading ("chính" STA) - không ThreadingModel giá tr?:

    M?t đ?i tư?ng đư?c cung c?p b?i h? ph?c v? này hy v?ng s? đư?c truy c?p b?i cùng m?t khách hàng STA mà nó đư?c t?o ra. Ngoài ra, máy ch? s? t?t c? c?a nó đi?m nh?p c?nh, ch?ng h?n như DllGetClassObject và DllCanUnloadNow, và d? li?u toàn c?u đ? đư?c truy c?p b?i các ch? đ? tương t? (m?t liên k?t v?i STA chính). Các máy ch? đ? t?n t?i trư?c khi s? ra đ?i c?a multi- lu?ng trong COM là trong th? lo?i này. Các máy ch? không đư?c thi?t k? đ? đư?c truy c?p b?i nhi?u ch? đ? đ? COM t?o ra t?t c? các đ?i tư?ng đư?c cung c?p b?i các máy ch? STA chính c?a quá tr?nh và các cu?c g?i đ?n các đ?i tư?ng đang G?i b?i các ch? đ? liên quan đ?n chính STA. Khách hàng khác căn h? đư?c truy c?p vào các đ?i tư?ng thông qua proxy. Các cu?c g?i t? các các căn h? khác đ?n t? các proxy khai trong STA chính (liên- s?i marshaling) và sau đó đ? đ?i tư?ng. Marshaling này cho phép COM đ? đ?ng b? các cu?c g?i đ?n các đ?i tư?ng và các cu?c g?i đư?c gi?ng d?y b?i STA trong đ?i tư?ng đư?c t?o ra. Inter-thread marshaling là tương đ?i ch?m tr?c ti?p đi?n tho?i v? v?y nó đư?c khuy?n khích r?ng các máy ch? đư?c vi?t l?i đ? h? tr? nhi?u STAs (lo?i 2).
  2. Trong proc Server có h? tr? các mô h?nh đơn-ren căn h? (nhi?u STAs) - đánh d?u v?i ThreadingModel = căn h?:

    M?t đ?i tư?ng đư?c cung c?p b?i h? ph?c v? này hy v?ng s? đư?c truy c?p b?i cùng m?t khách hàng STA mà nó đư?c t?o ra. V? v?y, nó là tương t? như m?t đ?i tư?ng đư?c cung c?p b?i m?t máy ch? đơn-ren trong-proc. Tuy nhiên, các đ?i tư?ng do đi?u này cung c?p máy ch? có th? đư?c t?o ra trong nhi?u STAs c?a quá tr?nh, V? v?y các máy ch? ph?i thi?t k? c?a nó đi?m nh?p c?nh, ch?ng h?n như DllGetClassObject và DllCanUnloadNow, và d? li?u toàn c?u đ? s? d?ng đa lu?ng. Cho Ví d?, n?u hai STAs c?a m?t quá tr?nh t?o hai th? hi?n c?a trong proc đ?i tư?ng cùng m?t lúc, DllGetClassObject có th? đư?c g?i là đ?ng th?i b?i c? hai STAs. Tương t?, DllCanUnloadNow ph?i đư?c b?ng văn b?n đ? h? ph?c v? b?o v? kh?i b? b?c d? trong khi m? v?n đang th?c hi?n trong các h? ph?c v?.

    N?u các máy ch? cung c?p ch? có m?t th? hi?n c?a nhà máy s?n xu?t l?p đ? t?o ra t?t c? các đ?i tư?ng, l?p nhà máy th?c hi?n c?ng ph?i đư?c thi?t k? đ? s? d?ng đa lu?ng v? nó đư?c truy c?p b?i nhi?u khách hàng STAs. N?u máy ch? t?o ra m?t trư?ng h?p m?i c?a nhà máy s?n xu?t l?p m?i l?n DllGetClassObject đư?c g?i là, nhà máy s?n xu?t l?p h?c không c?n ph?i Thread an toàn. Tuy nhiên, th?c s? ph?i đ?ng b? hóa quy?n truy c?p vào b?t k? bi?n toàn c?u.

    COM các đ?i tư?ng t?o b?i nhà máy s?n xu?t l?p h?c không ph?i là s?i-an toàn. Tuy nhiên, truy c?p c?a các bi?n toàn c?u ph?i đư?c đ?ng b? hóa b?i các th?c. Sau khi t?o ra b?i m?t s?i, các đ?i tư?ng luôn luôn truy c?p thông qua đó thread và t?t c? các cu?c g?i đ?n các đ?i tư?ng đư?c đ?ng b? hóa b?i COM. Căn h? c?a khách hàng khác nhau hơn STA trong đó đ?i tư?ng đư?c t?o ra ph?i truy c?p vào đ?i tư?ng thông qua proxy. Nh?ng proxy đang t?o ra khi máy s? d?ng marshals giao di?n gi?a các căn h? c?a m?nh.

    B?t k? khách hàng t?o ra m?t đ?i tư?ng STA thông qua các nhà máy s?n xu?t l?p c?a nó đư?c m?t tr?c ti?p con tr? đ?n các đ?i tư?ng. Đi?u này là khác nhau hơn so v?i đ?a đơn-ren các đ?i tư?ng trong proc, nơi ch? STA chính c?a khách hàng đư?c m?t tr?c ti?p con tr? ch? t?i các đ?i tư?ng và t?t c? các khác STAs t?o l?i đ?i tư?ng truy nh?p t?i đ?i tư?ng thông qua m?t proxy. V? inter-thread marshaling ch?m so v?i đi?n tho?i tr?c ti?p, t?c đ? có th? đư?c c?i đáng k? thi?n b?i thay đ?i m?t máy ch? đơn-ren trong-proc đ? h? tr? nhi?u STAs.
  3. Trong proc Server h? tr? ch? MTA - đánh d?u v?i ThreadingModel = mi?n phí:

    M?t đ?i tư?ng đư?c cung c?p b?i h? ph?c v? này là an toàn cho ch? MTA. Nó th?c hi?n đ?ng b? hóa riêng c?a m?nh và đư?c truy c?p b?i nhi?u khách hàng ch? đ? cùng m?t lúc. H? ph?c v? này có th? có hành vi đó là không tương thích v?i các mô h?nh STA. (Ví d?, b?ng cách s? d?ng c?a các c?a s? hàng đ?i tin nh?n trong m?t cách mà phá v? các máy bơm thông đi?p c?a m?t STA.) Ngoài ra, b?i đánh d?u các mô h?nh threading c?a đ?i tư?ng như là "T? do," th?c c?a đ?i tư?ng nói sau đây: đ?i tư?ng này có th? đư?c g?i t? b?t k? khách hàng ch? đ?, nhưng đ?i tư?ng này c?ng có th? đi giao di?n con tr? tr?c ti?p (không có marshaling) cho b?t k? ch? đ? mà nó t?o và các ch? đ? có th? th?c hi?n cu?c g?i thông qua các con tr?. V? v?y, n?u khách hàng đi m?t giao di?n con tr? đ?n m?t đ?i tư?ng khách hàng th?c hi?n (ch?ng h?n như m?t b?n r?a chén) đ? đ?i tư?ng này, nó có th? ch?n đ? g?i tr? l?i thông qua con tr? giao di?n này t? b?t k? thread mà nó t?o ra. N?u các khách hàng là m?t STA, m?t cu?c g?i tr?c ti?p t? m?t ch? đ? mà là khác nhau t? các s?i đ? t?o ra b?n r?a chén đ?i tư?ng s? l?i (như ch?ng minh trong 2 ? trên). V? th? COM luôn đ?m b?o r?ng khách hàng trong ch? đ? liên quan đ?n m?t STA truy c?p lo?i đ?i tư?ng trong proc ch? thông qua m?t proxy. Ngoài ra, các đ?i tư?ng nên không t?ng h?p v?i marshaler mi?n phí-ren v? đó cho phép chúng ch?y tr?c ti?p trên ch? đ? c?a STA.
  4. Trong proc Server h? tr? mô h?nh căn h? và mi?n phí-lu?ng - đánh d?u v?i ThreadingModel = c? hai:

    M?t đ?i tư?ng đư?c cung c?p b?i h? ph?c v? này th?c hi?n đ?ng b? hóa riêng c?a m?nh và truy c?p đ?ng th?i b?i nhi?u khách hàng căn h?. Ngoài ra đ?i tư?ng này đư?c t?o ra và đư?c s? d?ng tr?c ti?p, thay v? c?a thông qua m?t proxy, trong STAs ho?c MTA m?t quá tr?nh khách hàng. B?i v? đ?i tư?ng này đư?c s? d?ng tr?c ti?p trong STAs, h? ph?c v? ph?i nguyên soái giao di?n c?a đ?i tư?ng, có th? t? các máy ch? khác gi?a các ch? đ? như v?y c?a nó truy c?p vào b?t k? đ?i tư?ng m?t cách phân lu?ng phù h?p đư?c đ?m b?o. Ngoài ra, b?ng cách đánh d?u các lu?ng mô h?nh c?a các đ?i tư?ng như "Both", //Missing th?c c?a đ?i tư?ng nói sau đây: đ?i tư?ng này có th? đư?c g?i t? b?t k? khách hàng ch? đ?, nhưng b?t k? callbacks t? đ?i tư?ng này cho khách hàng s? đư?c th?c hi?n ch? trên căn h?, trong đó đ?i tư?ng đ? nh?n đư?c con tr? giao di?n đ?i tư?ng g?i l?i. COM cho phép m?t đ?i tư?ng đư?c t?o ra tr?c ti?p trong m?t STA c?ng như trong m?t MTA tr?nh khách hàng.

    B?i v? b?t k? căn h? đó t?o ra m?t đ?i tư?ng như v?y luôn luôn đư?c m?t tr?c ti?p con tr? ch? không ph?i là m?t con tr? ?y quy?n, ThreadingModel "C? hai" các đ?i tư?ng cung c?p các c?i thi?n hi?u su?t qua ThreadingModel "Mi?n phí" đ?i tư?ng khi đư?c t?i trong m?t STA.

    B?i v? m?t ThreadingModel "Both" đ?i tư?ng c?ng đư?c thi?t k? đ? truy c?p MTA (nó là hoàn toàn an toàn c?a s?i trong n?i b?), nó có th? tăng t?c đ? hi?u su?t b?i t?p h?p v?i marshaler đư?c cung c?p b?i CoCreateFreeThreadedMarshaler. Đ?i tư?ng cung c?p h? th?ng này t?ng h?p trong b?t k? đ?i tư?ng g?i đi?n tho?i và tùy ch?nh nguyên soái hư?ng con tr? đ?n các đ?i tư?ng vào t?t c? các căn h? trong ti?n tr?nh. Khách hàng trong b?t k? căn h? cao c?p, cho dù m?t STA ho?c MTA, sau đó có th? truy nh?p đ?i tư?ng tr?c ti?p thay v? thông qua m?t proxy. Ví d?, m?t khách hàng m?u STA t?o ra trong proc đ?i tư?ng trong STA1 và marshals đ?i tư?ng đ? STA2. N?u không có đ?i tư?ng g? không T?ng h?p v?i marshaler mi?n phí-ren, STA2 thu truy c?p vào các đ?i tư?ng thông qua m?t proxy. N?u có, mi?n phí-ren marshaler cung c?p STA2 v?i m?t con tr? tr?c ti?p đ?n các đ?i tư?ng

    LƯU ?: Chăm sóc ph?i đư?c th?c hi?n khi t?p h?p v?i s? mi?n phí-ren marshaler. Ví d?, gi? s? r?ng m?t đ?i tư?ng đư?c đánh d?u là ThreadingModel "C? hai" (và c?ng t?p h?p v?i s? mi?n phí-ren marshaler) có m?t thành viên d? li?u đó là m?t con tr? giao di?n khác đ?i tư?ng mà ThreadingModel là "Căn h?". Sau đó cho r?ng m?t STA t?o ra các đ?i tư?ng đ?u tiên và trong sáng t?o, các đ?i tư?ng đ?u tiên t?o ra các đ?i tư?ng th? hai. Như m?t quy t?c th?o lu?n ? trên, các đ?i tư?ng đ?u tiên là bây gi? đang n?m gi? m?t con tr? tr?c ti?p cho đ?i tư?ng th? hai. Bây gi? cho r?ng các STA marshals giao di?n con tr? đ?i tư?ng đ?u tiên khác căn h?. B?i v? các đ?i tư?ng đ?u tiên t?p h?p v?i mi?n phí - ren marshaler, m?t con tr? tr?c ti?p đ?n các đ?i tư?ng đ?u tiên đư?c trao cho th? hai căn h?. N?u căn h? th? hai sau đó cu?c g?i thông qua con tr? này, và N?u cu?c g?i này gây ra đ?i tư?ng đ?u tiên đ? g?i thông qua giao di?n con tr? ch? t?i các đ?i tư?ng th? hai, sau đó m?t l?i đ? x?y ra, b?i v? các Th? hai đ?i tư?ng không có ngh?a là đ? đư?c g?i là tr?c ti?p t? th? hai căn h?. N?u các đ?i tư?ng đ?u tiên đang n?m gi? m?t con tr? đ?n m?t proxy đ? các Th? hai đ?i tư?ng thay v? m?t con tr? tr?c ti?p, đi?u này s? gây ra m?t khác nhau l?i. H? th?ng proxy c?ng là đ?i tư?ng COM có liên quan đ?n m?t trong nh?ng và ch? có m?t căn h?. H? theo d?i c?a căn h? c?a h? đ? tránh circularities nh?t đ?nh. V? v?y m?t đ?i tư?ng g?i ra trên m?t proxy liên k?t v?i m?t căn h? khác nhau hơn so v?i các ch? đ? mà trên đó các đ?i tư?ng đang ch?y s? nh?n đư?c RPC_E_WRONG_THREAD tr? l?i t? các proxy và các cu?c g?i s? th?t b?i.

Lu?ng kh? năng tương tác mô h?nh gi?a khách hàng và các đ?i tư?ng trong quá tr?nh

T?t c? các k?t h?p c?a các mô h?nh lu?ng kh? năng tương tác đư?c phép gi?a khách hàng và các đ?i tư?ng trong quá tr?nh.

COM cho phép t?t c? các khách hàng m?u STA đ? inter-operate v?i lu?ng đơn các đ?i tư?ng trong proc b?ng cách t?o và truy c?p vào đ?i tư?ng trong các khách hàng c?a chính STA và marshaling nó cho khách hàng STA đư?c g?i là CoCreateInstance [ví d?].

N?u m?t MTA trong m?t khách hàng t?o ra m?t mô h?nh STA trong proc máy ch?, COM quay lên m?t "ch?" STA trong các khách hàng. Máy ch? này STA t?o ra các đ?i tư?ng và các giao di?n con tr? marshaled quay l?i MTA. Tương t? như v?y, khi m?t STA t?o ra m?t máy ch? trong proc MTA, COM quay lên m?t máy ch? lưu tr? MTA trong đó đ?i tư?ng đư?c t?o ra và marshaled quay l?i STA. kh? năng tương tác gi?a các mô h?nh lu?ng đơn và MTA mô h?nh đư?c x? l? tương t? như v?y b?i v? các mô h?nh lu?ng duy nh?t là ch? là m?t trư?ng h?p thoái hóa c?a các mô h?nh STA.

Marshaling m? ph?i đư?c cung c?p cho b?t k? tu? ch?nh giao di?n mà trong proc t? máy ch? th?c hi?n n?u nó mu?n h? tr? kh? năng tương tác đ?i h?i COM đ? marshal giao di?n gi?a các khách hàng căn h?. Xem các tài li?u tham kh?o ph?n dư?i đây đ? bi?t thêm thông tin.

M?i quan h? gi?a các mô h?nh lu?ng và đ?i tư?ng l?p nhà máy quay tr? l?i

M?t đ?nh ngh?a chính xác c?a máy ch? trong proc đang đư?c "n?p vào" căn h? là gi?i thích trong hai bư?c sau đây:

  1. N?u t?p DLL có ch?a l?p máy ch? trong proc đ? không trư?c đây đư?c n?p (đư?c ánh x? vào trong không gian đ?a ch? quá tr?nh) b?i các ho?t đ?ng h? th?ng n?p, thao tác đư?c th?c hi?n, và COM l?y đư?c đ?a ch? ch?c năng DLLGetClassObject xu?t kh?u b?i DLL. N?u t?p DLL có trư?c đây đ? đư?c n?p b?i m?t ch? đ? liên k?t v?i b?t k? căn h? cao c?p, đi?u này giai đo?n đư?c b? qua.
  2. COM s? d?ng thread (ho?c, trong trư?ng h?p c?a MTA, m?t trong các ch? đ?) liên k?t v?i căn h? "n?p" đ? g?i DllGetClassObject ch?c năng xu?t kh?u c?a DLL yêu c?u CLSID giai c?p c?n thi?t. Đ?i tư?ng nhà máy quay tr? l?i sau đó đư?c s? d?ng đ? t?o ra trư?ng h?p c?a các đ?i tư?ng l?p.

    Bư?c th? hai (g?i DllGetClassObject b?i COM) x?y ra m?i và m?i khi m?t khách hàng g?i CoGetClassObject/CoCreateIntance [ví d?], th?m chí t? trong cùng m?t căn h?. Nói cách khác, DllGetClassObject có th? g?i là nhi?u l?n b?i m?t thread g?n li?n v?i cùng m?t căn h? chung cư; t?t c? ph? thu?c vào bao nhiêu khách hàng trong căn h? đó đang c? g?ng đ? có đư?c quy?n truy c?p đ?i tư?ng nhà máy s?n xu?t l?p cho l?p đó.
Tác gi? c?a l?p hi?n th?c, và cu?i cùng, tác gi? c?a DLL gói m?t t?p cho các l?p h?c đ? hoàn toàn t? do đ? quy?t đ?nh nh?ng g? nhà máy đ?i tư?ng đ? tr? v? đ? đáp ?ng v?i các ch?c năng DllGetClassObject cu?c g?i. Tác gi? c?a các gói DLL có nói cu?i cùng b?i v? m? "đ?ng sau" m?c nh?p DLL toàn DllGetClassObject() duy nh?t đi?m là nh?ng g? đ? đ?u tiên và cu?i cùng có kh? năng quy?n quy?t đ?nh nh?ng vi?c c?n làm. Ba kh? năng tiêu bi?u là:

  1. DllGetClassObject tr? v? m?t đ?i tư?ng duy nh?t l?p nhà máy trên m?i đi?n tho?i ch? đ? (có ngh?a là m?t trong nh?ng đ?i tư?ng l?p nhà máy trên m?i STA và có kh? năng các nhà nhi?u l?p máy trong MTA).
  2. DllGetClassObject luôn luôn tr? v? đ?i tư?ng l?p nhà máy tương t?, b?t k? v? nh?n d?ng c?a s?i ch? g?i đi?n tho?i ho?c các lo?i c?a căn h? có liên k?t v?i thread g?i đi?n tho?i.
  3. DllGetClassObject tr? v? m?t đ?i tư?ng duy nh?t l?p nhà máy trên m?i đi?n tho?i căn h? (m?t cho m?i căn h? ? c? STA và MTA).
Có nh?ng kh? năng khác cho m?i quan h? gi?a các cu?c g?i đ?n DllGetClassObject và đ?i tư?ng l?p nhà máy th?c s? tr? l?i (ví d? như m?t m?i đ?i tư?ng l?p nhà máy trên m?i cu?c g?i đ?n DllGetClassObject) nhưng h? không làm như th? hi?n nay xu?t hi?n đ? đ?c bi?t h?u ích.

B?n tóm t?t c?a khách hàng và đ?i tư?ng lu?ng các mô h?nh cho các máy ch? trong Proc

B?ng sau đây tóm t?t s? tương tác gi?a khác nhau lu?ng mô h?nh khi kêu g?i m?t s?i khách hàng đ?u tiên các CoGetClassObject m?t l?p h?c đư?c th?c hi?n như m?t máy ch? trong proc.

Các lo?i khách hàng/ch? đ?:

  • khách hàng đang ch?y trong m?t ch? đ? liên quan đ?n STA "chính" (đ?u tiên Thread đ? g?i CoInitialize ho?c CoInitializeEx v?i COINIT_APARTMENTTHREADED c?)-g?i này STA0 (c?ng đư?c g?i là đ?a đơn - lu?ng mô h?nh).
  • khách hàng đang ch?y trong m?t ch? đ? liên quan đ?n trong b?t k? cu?c g?i STA [ASCII 150] khác STA này *.
  • khách hàng đang ch?y trong m?t ch? đ? liên quan đ?n trong MTA.
Các lo?i DLL máy ch?:

  • H? ph?c v? đ? không có phím ThreadingModel--g?i đây là "Không."
  • Máy ch? đư?c đánh d?u "Căn h?" - g?i này "Apt."
  • Máy ch? đư?c đánh d?u "T? do."
  • Máy ch? đư?c đánh d?u "C? hai."
Khi đ?c b?ng dư?i đây, h?y ghi nh? đ?nh ngh?a đư?c th?c hi?n trên c?a "n?p" tr?nh ph?c v? vào m?t căn h?.
Client     Server     Result
------     ------     -----------------------------------------
STA0       None       Direct access; server loaded into STA0
STA*       None       Proxy access; server loaded into
                      STA0.
MTA        None       Proxy access; server loaded into STA0; STA0 created
                      automatically by COM if necessary;
STA0       Apt        Direct access; server loaded into STA0
STA*       Apt        Direct access; server loaded into STA*
MTA        Apt        Proxy access; server loaded into an
STA created automatically by COM.
STA0       Free       Proxy access; server is loaded into MTA
MTA created automatically by COM if necessary.
STA*       Free       Same as STA0->Free
MTA        Free       Direct access
STA0       Both       Direct access; server loaded into STA0
STA*       Both       Direct access; server loaded into STA*
MTA        Both       Direct access; server loaded into the MTA
				

THAM KH?O

SDK tài li?u trên CoRegisterMessageFilter() và IMessageFilter giao di?n.

Đ? bi?t thêm chi ti?t, xin vui l?ng xem các bài vi?t sau đây trong các Cơ s? ki?n th?c Microsoft:
136885 OLE đ? ph?i g?i tin nh?n
137629 Trong proc đ?i tư?ng tùy ch?nh giao di?n trong căn h? mô h?nh ?ng d?ng khách

Thu?c tính

ID c?a bài: 150777 - L?n xem xét sau cùng: 18 Tháng Tám 2011 - Xem xét l?i: 2.0
T? khóa: 
kbinfo kbmt KB150777 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:150777

Cung cấp Phản hồi

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com