S? d?ng đ?u ràng bu?c và cu?i ràng bu?c trong t? đ?ng hóa

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 245115 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

Làm th? nào b?n liên k?t v?i m?t máy ch? t? đ?ng hóa có th? ?nh hư?ng đ?n nhi?u đi?u chương tr?nh c?a b?n, ch?ng h?n như hi?u su?t, linh ho?t, và b?o tr?.

Bài vi?t này gi?i thích các lo?i ràng bu?c có s?n đ? khách hàng t? đ?ng hóa, và n?ng c? hai bên c?a m?i phương pháp.

THÔNG TIN THÊM

T? đ?ng hóa là m?t quá tr?nh trong trư?ng h?p m?t thành ph?n ph?n m?m liên l?c v?i và/ho?c ki?m soát m?t ph?n m?m thành ph?n b?ng cách s? d?ng c?a Microsoft Mô h?nh đ?i tư?ng thành ph?n (COM). Nó là cơ s? cho h?u h?t th?p t?-thành ph?n truy?n thông đư?c s? d?ng trong các ngôn ng? như Visual Basic ho?c Visual Basic cho Các ?ng d?ng, và đ? tr? thành m?t ph?n c?a h?u h?t các chương tr?nh b?nh thư?ng.

Trong l?ch s?, m?t đ?i tư?ng t? đ?ng hóa là b?t k? đ?i tư?ng đ? h? tr? cho IDispatch giao di?n. Giao di?n này cho phép khách hàng đ? g?i phương pháp và các thu?c tính lúc ch?y th?i gian mà không c?n ph?i bi?t đ?i tư?ng chính xác h? giao ti?p v?i lúc th?i gian thi?t k?; m?t quá tr?nh đư?c g?i là ràng bu?c vào cu?i. Hôm nay, tuy nhiên, thu?t ng? Đ?i tư?ng t? đ?ng hóa có th? đư?c áp d?ng cho h?u như b?t k? đ?i tư?ng COM, ngay c? nh?ng ngư?i làm h? tr? IDispatch (và do đó không th? b? ràng bu?c vào cu?i). Bài vi?t này gi? đ?nh các đ?i tư?ng b?n t? đ?ng hoá h? tr? c? hai phương pháp ràng bu?c.

Nh?ng g? là b?t bu?c?

Ràng bu?c là m?t quá tr?nh k?t h?p g?i ch?c năng b?ng văn b?n c?a các l?p tr?nh đ? m? th?c t? (n?i b? hay bên ngoài) th?c hi?n các ch?c năng. Nó đư?c th?c hi?n khi ?ng d?ng đư?c biên so?n, và t?t c? các ch?c năng g?i là trong m? ph?i b? ràng bu?c trư?c khi m? có th? đư?c th?c hi?n.

Đ? hi?u quá tr?nh suy ngh? c?a "ràng bu?c" v? xu?t b?n m?t cu?n sách. H?y tư?ng tư?ng c?a b?n M? s? là gi?ng như các văn b?n c?a cu?n sách đó trong m?t đo?n nh?t đ?nh b?n có b?ng văn b?n cái g? như "xem chương 12, trang x cho bi?t thêm chi ti?t." B?n không bi?t nh?ng g? s? trang là cho đ?n khi cu?n sách xong, như v?y trư?c khi đo?n có th? đ?c như d? đ?nh, t?t c? các trang c?a cu?n sách ph?i b? ràng bu?c v?i nhau và các đúng trang s? chèn vào đo?n văn. B?n ch? đ?i cho cu?n sách đư?c "ràng bu?c" trư?c khi b?n có th? tham kh?o các ph?n khác c?a cu?n sách.

Ràng bu?c ph?n m?m là tương t?. M? c?a b?n t?o ra t? các b? ph?n mà c?n ph?i đư?c kéo v?i nhau trư?c khi m? có th? đư?c "đ?c." Ràng bu?c là các hành đ?ng c?a thay th? ch?c năng tên v?i b? nh? đ?a ch? (ho?c b? nh? offsets, đ? chính xác hơn) nơi m? s? "nh?y t?i" khi các ch?c năng đư?c g?i là. Cho các đ?i tư?ng COM, các Đ?a ch? là m?t bù đ?p b? nh? trong m?t b?ng con tr? (g?i là v-b?ng) đư?c t? ch?c b?i các đ?i tư?ng. Khi hàm COM là ràng bu?c, nó là ràng bu?c thông qua các v-b?ng.

C?u trúc c?a m?t đ?i tư?ng COM là đơn gi?n. Khi m? c?a b?n gi? m?t tham chi?u đ?n m?t đ?i tư?ng, nó gi? m?t con tr? gián ti?p đ?n đ?nh c?a các v-b?ng. V-b?ng là m?t m?ng c?a b? nh? đ?a ch? nơi m?i m?c là m?t các ch?c năng khác nhau mà có th? đư?c g?i vào đ?i tư?ng đó. Đ? g?i th? ba ch?c năng trên m?t COM đ?i tư?ng, b?n nh?y xu?ng ba m?c trong b?ng và sau đó nh?y t?i v? trí b? nh? đư?c đưa ra có. Mà th?c hi?n các m? cho các ch?c năng, và khi hoàn thành, tr? l?i b?n đ? s?n sàng đ? th?c thi các d?ng k? ti?p c?a M?.

+-[Code]------------+  +.................................[COM Object]...+
|                   |  : +-------------+                                :
|Set obj = Nothing -|--->| obj pointer |                                :
|                   |  : +-|-----------+                                :
+-------------------+  :   |   +-----------------+                      :
                       :   +-->| v-table pointer |                      :
                       :       +--|--------------+                      :
                       :          |                                     :
                       :          |  +----------------------------+     :
                       :  (3rd)   |  | Function 1 Address pointer |     :
                       : (Offset) |  +----------------------------+     :
                       :          |  | Function 2 Address pointer |     :
                       :          |  +----------------------------+     :
                       :          +->| Function 3 Address pointer |     :
                       :             +----------------------------+     :
                       +................................................+

				
Ví d? trên cho th?y nh?ng g? x?y ra khi phát hành m?t đ?i tư?ng COM. B?i v? t?t c? COM đ?i tư?ng k? th?a t? IUnknown, các m?c ba l?n đ?u tiên trong các b?ng là phương pháp đ? IUnknown. Khi b?n c?n đ? gi?i phóng m?t đ?i tư?ng, m? c?a b?n g?i ch?c năng th? ba trong v-b?ng (IUnknown::Release).

May m?n thay, công vi?c này đư?c th?c hi?n b?i Visual Basic đ?ng sau h?u trư?ng. Như m?t th? giác L?p tr?nh cơ b?n, b?n không bao gi? có đ? đ?i phó v?i m?t v-b?ng tr?c ti?p. Tuy nhiên, đi?u này c?u trúc là như th? nào t?t c? các đ?i tư?ng COM b? ràng bu?c, và nó là quan tr?ng mà b?n đang quen thu?c v?i nó đ? hi?u nh?ng g? ràng bu?c.

Ràng bu?c đ?u

Ví d? trên là nh?ng g? là b?t đư?c bi?t đ?n s?m nh?t (ho?c v-b?ng) bu?c. Cho t?t c? các đ?i tư?ng COM, h?nh th?c ràng bu?c đưa ra b?t c? khi nào m?t đ?i tư?ng COM IUnknown giao di?n đư?c g?i là. Nhưng nh?ng g? v? các ch?c năng khác c?a đ?i tư?ng? Làm th? nào làm b?n g?i phương pháp làm m?i ho?c thu?c tính ph? huynh? Đây là nh?ng tùy ch?nh ch?c năng đó là thông thư?ng duy nh?t cho m?t đ?i tư?ng. N?u v? trí c?a h? trong các v-b?ng không th? đư?c gi? đ?nh, làm th? nào đ? b?n t?m các đ?a ch? ch?c năng c?n thi?t đ? g?i cho h??

Câu tr? l?i, t?t nhiên, ph? thu?c vào vi?c có hay không b?n bi?t trư?c nh?ng g? c?a đ?i tư?ng v-b?ng trông gi?ng như. N?u b?n làm, b?n có th? th?c hi?n các quá tr?nh đ?u ràng bu?c cùng đ? các đ?i tư?ng tùy ch?nh phương pháp như b?n đ? làm cho nó IUnknown phương pháp. Đây là nh?ng g? thư?ng có ngh?a là b?i "đ?u-ràng bu?c."

S? d?ng đ?u ràng bu?c vào m?t đ?i tư?ng, b?n c?n ph?i bi?t nh?ng g? v-b?ng c?a nó trông gi?ng như. Trong Visual Basic, b?n có th? làm đi?u này b?ng cách thêm m?t tham chi?u đ?n m?t lo?i thư vi?n mô t? các đ?i tư?ng, giao di?n c?a nó (v-b?ng), và t?t c? các ch?c năng mà có th? đư?c g?i là trên đ?i tư?ng. Khi đ? xong, b?n có th? tuyên b? m?t đ?i tư?ng như là m?t lo?i nh?t đ?nh, sau đó thi?t l?p và s? d?ng mà đ?i tư?ng b?ng cách s? d?ng các v-b?ng. Ví d?, n?u b?n mu?n t? đ?ng hoá Microsoft Office Excel s? d?ng s?m ràng bu?c, b?n s? thêm m?t tham chi?u đ?n "Microsoft Excel 8,0 đ?i tư?ng Library" t? Project|H?p tho?i tham chi?u, và sau đó tuyên b? c?a b?n bi?n như là c?a lo?i "Excel.Application." T? đó v? sau, t?t c? các cu?c g?i đư?c th?c hi?n cho đ?i tư?ng c?a b?n bi?n s? b? ràng bu?c đ?u:
' Set reference to 'Microsoft Excel 8.0 Object Library' in
' the Project|References dialog (or Tools|References for VB4 or VBA).

' Declare the object as an early-bound object
  Dim oExcel As Excel.Application

  Set oExcel = CreateObject("Excel.Application")

' The Visible property is called via the v-table
  oExcel.Visible = True
				
Phương pháp này làm vi?c tuy?t v?i nh?t c?a th?i gian, nhưng n?u b?n không bi?t đ?i tư?ng chính xác, b?n s? s? d?ng t?i th?i gian thi?t k?? Ví d?, n?u b?n c?n nói chuy?n v?i nhi?u phiên b?n c?a Excel, ho?c có th? đ?n m?t đ?i tư?ng "không r?" hoàn toàn?

Ràng bu?c vào cu?i

COM bao g?m IDispatch. Các đ?i tư?ng th?c hi?n IDispatch đang nói đ? có m?t dispinterface (n?u nó là giao di?n duy nh?t h? h? tr?) ho?c kép giao di?n (n?u h? c?ng có m?t giao di?n tùy ch?nh mà b?n có th? đ?u liên k?t v?i). Khách hàng đó ràng bu?c đ? IDispatch đư?c g?i "h?u ràng bu?c" b?i v? chính xác phương th?c h? đang g?i đi?n tho?i ho?c tài s?n đư?c xác đ?nh t?i th?i gian ch?y b?ng cách s? d?ng các phương pháp c?a IDispatch đ? xác đ?nh v? trí h?. Đi l?i cho các ví d? sách trư?c đó, h?y suy ngh? c?a nó là gi?ng như m?t chú thích mà ch? đ?o b?n đ?n b?ng c?a n?i dung nơi b?n có "nh?n" s? trang "th?i gian đ?c" ch? không ph?i có nó đ? in có trong văn b?n.

S? k? di?u c?a giao di?n qu?n l? b?i hai ch?c năng: GetIDsOfNames và Invoke. Đ?u tiên tên g?i hàm b?n đ? (chu?i) vào m?t đ?nh danh (g?i là m?t dispid) đ?i di?n cho các ch?c năng. M?t l?n b?n bi?t ID cho các ch?c năng b?n mu?n g?i, b?n có th? g?i nó b?ng cách s? d?ng các G?i ch?c năng. Đây là h?nh th?c phương pháp invocation đư?c g?i là "ràng bu?c cu?i."

M?t l?n n?a, trong Visual Basic cách b?n xác đ?nh như th? nào đ?i tư?ng là ràng bu?c là b?i tuyên b? đ?i tư?ng c?a b?n. N?u b?n khai báo m?t bi?n đ?i tư?ng như "Đ?i tư?ng" b?n đang có, trong th?c t?, nói cho Visual Basic đ? s? d?ng IDispatch, và do đó tr? ràng bu?c:
' No reference to a type library is needed to use late binding.
' As long as the object supports IDispatch, the method can 
' be dynamically located and invoked at run-time.

' Declare the object as a late-bound object
  Dim oExcel As Object

  Set oExcel = CreateObject("Excel.Application")

' The Visible property is called via IDispatch
  oExcel.Visible = True
				
Như b?n th?y, ph?n c?n l?i c?a m? c?a b?n là như nhau. S? khác bi?t duy nh?t gi?a đ?u ràng bu?c và ràng bu?c vào cu?i (v? m? b?n vi?t) là trong khai báo bi?n.

Nó là quan tr?ng c?n lưu ? r?ng nh?ng g? là "mu?n ràng bu?c"ch?c năng đư?c g?i là và không ph?i là cách nó đư?c g?i là. T? các th?o lu?n trư?c đó trên ràng bu?c nói chung, b?n nên thông báo r?ng IDispatch chính nó là "s?m b? ràng bu?c:" đó là đ? nói r?ng Visual Basic làm cho các cu?c g?i đ? thi?t l?p các tài s?n có th? nh?n th?y thông qua m?t m?c nh?p v-b?ng (IDispatch::Invoke) v? nó s? b?t k? cu?c g?i COM. COM chính nó là trách nhi?m chuy?n ti?p cu?c g?i đ?n các ch?c năng chính xác đ? làm cho Excel có th? nh?n th?y. Này v? m?nh cho phép th? giác Khách hàng cơ b?n đ? đư?c biên so?n (có ngh?a là, b? ràng bu?c vào m?t đ?a ch? h?p l? hàm) nhưng v?n không bi?t ch?c năng chính xác r?ng s? th?c s? làm vi?c.

Ràng bu?c Dispid

M?t s? khách hàng t? đ?ng hóa (h?u h?t đáng chú ? MFC và Visual Basic 3.0, nhưng c?ng Visual Basic 5.0 và 6,0 v?i đi?u khi?n ActiveX) s? d?ng m?t h?nh th?c lai c?a tr? ràng bu?c đư?c g?i là dispid ràng bu?c. N?u đ?i tư?ng COM đư?c bi?t đ?n vào lúc thi?t k?, các dispids cho các ch?c năng đư?c g?i là có th? đư?c lưu tr? và thông qua tr?c ti?p đ?n IDispatch::Invoke mà không c?n g?i GetIDsOfNames lúc th?i gian ch?y. Đi?u này có th? tăng đáng k? hi?u su?t, b?i v? thay v? c?a làm cho hai COM các cu?c g?i cho m?i ch?c năng, b?n ch? c?n ph?i làm m?t.

Dispid ràng bu?c là không ph?i là m?t l?a ch?n b?n có th? b?nh thư?ng ch?n trong Visual Basic 5.0 ho?c 6.0. Nó đư?c s? d?ng đ?i tư?ng đư?c tham chi?u trong m?t thư vi?n ki?u nhưng không ch?a m?t tu? ch?nh giao di?n (có ngh?a là, đ?i v?i các đ?i tư?ng có m?t dispinterface ch?) và cho T?ng h?p đi?u khi?n ActiveX, nhưng nói chung, Visual Basic s? d?ng đ?u ràng bu?c nơi nào b?n thư?ng s? s? d?ng dispid ràng bu?c.

H?nh th?c c?a ràng bu?c tôi nên s? d?ng?

Câu tr? l?i cho câu h?i này ph? thu?c nhi?u vào vi?c thi?t k? c?a b?n d? án như b?t c? đi?u g? khác. Microsoft khuy?n cáo đ?u ràng bu?c trong h?u h?t các trư?ng h?p. Tuy nhiên, có th? có l? do cho vi?c l?a ch?n cu?i ràng bu?c.

S?m ràng bu?c là phương pháp ưa thích. Nó là bi?u di?n t?t nh?t b?i v? c?a b?n ?ng d?ng liên k?t tr?c ti?p đ?n đ?a ch? c?a các ch?c năng đư?c g?i là và không có không có chi phí thêm trong khi làm m?t tra c?u th?i gian ch?y. V? t?ng th? th?c hi?n t?c đ?, nó là ít nh?t hai l?n nhanh như ràng bu?c vào cu?i.

S?m ràng bu?c c?ng cung c?p các lo?i an toàn. Khi b?n có m?t tham chi?u thi?t l?p đ? các thành ph?n c?a thư vi?n ki?u, Visual Basic cung c?p h? tr? IntelliSense đ? giúp b?n m? m?i ch?c năng m?t cách chính xác. Visual Basic c?ng c?nh báo b?n n?u d? li?u nh?p m?t tham bi?n ho?c giá tr? tr? l?i không chính xác, ti?t ki?m r?t nhi?u th?i gian khi vi?t và g? l?i m?.

H?u ràng bu?c là v?n c?n h?u ích trong các t?nh hu?ng nơi giao di?n chính xác c?a m?t đ?i tư?ng không đư?c bi?t đ?n vào th?i gian thi?t k?. N?u c?a b?n ?ng d?ng t?m ki?m đ? nói chuy?n v?i nhi?u máy ch? không r? ho?c c?n ph?i g?i ch?c năng theo tên (s? d?ng Visual Basic 6.0 CallByName ch?c năng ví d?) sau đó b?n c?n ph?i s? d?ng cu?i ràng bu?c. Cu?i năm ràng bu?c c?ng là h?u ích đ? làm vi?c xung quanh v?n đ? tương thích gi?a nhi?u các phiên b?n c?a m?t thành ph?n mà đ? không đúng cách thay đ?i ho?c chuy?n th? giao di?n c?a nó gi?a các phiên b?n.

Nh?ng l?i th? đư?c đưa ra đ? ràng bu?c đ?u làm cho nó nh?ng l?a ch?n t?t nh?t b?t c? khi nào có th?.

Vi?c duy tr? kh? năng tương thích qua nhi?u phiên b?n

N?u b?n s? s? d?ng m?t thành ph?n mà b?n không phân ph?i l?i v?i thi?t l?p c?a b?n gói, và không th? đư?c đ?m b?o các phiên b?n chính xác, b?n s? giao ti?p v?i t?i th?i gian ch?y, b?n nên chú ? đ?c bi?t đ? ràng bu?c đ?u m?t giao di?n tương thích v?i t?t c? các phiên b?n c?a các thành ph?n, ho?c (trong m?t s? trư?ng h?p) s? d?ng cu?i ràng bu?c đ? g?i m?t phương pháp có th? t?n t?i trong m?t c? th? Phiên b?n và th?t b?i gracefully N?u phương pháp đó không ph?i là hi?n di?n trong các phiên b?n cài đ?t trên h? th?ng khách hàng.

Cung c?p các ?ng d?ng Microsoft Office m?t ví d? đi?n h?nh c?a các máy ch? COM. Các ?ng d?ng văn ph?ng s? thư?ng m? r?ng giao di?n c?a h? đ? thêm ch?c năng m?i ho?c đúng trư?c nh?ng thi?u sót gi?a các phiên b?n. N?u b?n c?n ph?i t? đ?ng hoá m?t ?ng d?ng văn ph?ng, nó là khuy?n cáo r?ng b?n s?m k?t Phiên b?n s?m nh?t c?a các s?n ph?m mà b?n hy v?ng có th? đư?c cài đ?t trên h? th?ng khách hàng c?a b?n. Ví d?, n?u b?n c?n ph?i có th? t? đ?ng hoá Excel 95, Excel 97, Excel 2000 và Excel 2002, b?n nên s? d?ng thư vi?n ki?u cho Excel 95 (XL5en32.olb) đ? duy tr? kh? năng tương thích v?i t?t c? ba phiên b?n.

Các ?ng d?ng văn ph?ng c?ng ch?ng minh r?ng đ?i tư?ng các mô h?nh v?i giao di?n kép l?n có th? b? h?n ch? trong marshalling trên m?t s? n?n t?ng. Đ?i v?i m? c?a b?n đ? làm vi?c t?t nh?t trên t?t c? các n?n t?ng, s? d?ng IDispatch. Đ? bi?t thêm thông tin v? vi?c duy tr? kh? năng tương thích khi làm vi?c v?i văn ph?ng các ?ng d?ng, nh?p vào s? bài vi?t sau đ? xem bài vi?t trong cơ s? ki?n th?c Microsoft:
247579S? d?ng DISPID ràng bu?c đ? t? đ?ng hoá các ?ng d?ng văn ph?ng b?t c? khi nào có th?

THAM KH?O

Đ? bi?t thêm thông tin v? COM, v-b?ng, và s? d?ng T? đ?ng hóa, h?y xem các cu?n sách sau đây:
Rogerson, Dale, Bên trong COMMSPRESS, ISBN: 1-57231-349-8.

Curland, Matt, Nâng cao Visual Basic 6DevelopMentor, 0201707128.

Thu?c tính

ID c?a bài: 245115 - L?n xem xét sau cùng: 21 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft Office Ultimate 2007
  • Microsoft Office Enterprise 2007
  • Microsoft Office Professional 2007
  • Microsoft Office Professional Plus 2007
  • Microsoft Office Standard 2007
  • Microsoft Office Home and Student 2007
  • Microsoft Office Basic 2007
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
T? khóa: 
kbautomation kbinfo kbmt KB245115 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:245115

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