Object Linking and Embedding

**Object Linking & Embedding** (**OLE**) tạm dịch: *liên kết và nhúng đối tượng*,  là một công nghệ độc quyền được phát triển bởi Microsoft cho phép nhúng và siêu liên kết với các tài liệu và các đối tượng khác. Đối với các nhà phát triển, nó mang lại OLE Control Extension (OCX), một cách để phát triển và sử dụng các phần tử giao diện người dùng tùy chỉnh. Ở cấp độ kỹ thuật, đối tượng OLE là bất kỳ đối tượng nào thực hiện giao diện IOleObject, có thể cùng với một loạt các giao diện khác, tùy thuộc vào nhu cầu của đối tượng.

## Tổng quan
OLE cho phép ứng dụng chỉnh sửa để xuất một phần tài liệu sang một ứng dụng chỉnh sửa khác và sau đó nhập nó với nội dung bổ sung. Ví dụ: một hệ thống xuất bản trên máy tính để bàn có thể gửi một số văn bản tới trình xử lý văn bản hoặc hình ảnh tới trình chỉnh sửa bitmap bằng OLE. Lợi ích chính của OLE là thêm các loại dữ liệu khác nhau vào một tài liệu từ các ứng dụng khác nhau, như trình soạn thảo văn bản và trình chỉnh sửa hình ảnh. Điều này tạo ra một tài liệu định dạng tập tin nhị phân hợp chất và một tập tin chủ mà tài liệu làm cho tài liệu tham khảo. Thay đổi dữ liệu trong tệp chính ngay lập tức ảnh hưởng đến tài liệu tham chiếu đến nó. Điều này được gọi là "liên kết" (thay vì "nhúng").

Việc sử dụng chính của nó là quản lý các định dạng tập tin nhị phân hợp chất, nhưng nó cũng được sử dụng để truyền dữ liệu giữa các phần mềm ứng dụng khác nhau bằng cách sử dụng thao tác kéo và thả và clipboard.

## Lịch sử

### OLE 1.0
OLE 1.0, phát hành năm 1990, là một sự phát triển của khái niệm Dynamic Data Exchange (DDE) ban đầu mà Microsoft đã phát triển cho các phiên bản trước của Windows. Mặc dù DDE bị giới hạn trong việc truyền lượng dữ liệu giới hạn giữa hai ứng dụng đang chạy, OLE có khả năng duy trì liên kết hoạt động giữa hai tài liệu hoặc thậm chí nhúng một loại tài liệu trong một tài liệu khác.

Các máy chủ và máy khách OLE giao tiếp với các thư viện hệ thống bằng cách sử dụng các bảng chức năng ảo hoặc VTBL. VTBL bao gồm một cấu trúc của các con trỏ hàm mà thư viện hệ thống có thể sử dụng để giao tiếp với máy chủ hoặc máy khách. Các thư viện máy chủ và máy khách, OLESVR.DLL và OLECLI.DLL,ban đầu được thiết kế để giao tiếp giữa chúng bằng cách sử dụng thông báo WM_DDE_EXECUTE.

OLE 1.0 sau đó đã phát triển để trở thành một kiến trúc cho các thành phần phần mềm được gọi là Mô hình đối tượng thành phần (Component Object Model-COM), và sau đó là DCOM.

Khi một đối tượng OLE được đặt vào clipboard hoặc được nhúng trong một tài liệu, cả hai biểu diễn trực quan trong các định dạng Windows nguyên bản (chẳng hạn như bitmap hoặc metafile) được lưu trữ, cũng như dữ liệu bên dưới theo định dạng riêng của nó. Điều này cho phép ứng dụng hiển thị đối tượng mà không tải ứng dụng được sử dụng để tạo đối tượng, đồng thời cho phép đối tượng được chỉnh sửa, nếu ứng dụng thích hợp được cài đặt.

**Object Packager**, một thành phần của OLE, có trong Windows 3.1 đến Windows XP cho phép một đối tượng không phải OLE được "đóng gói" để nó có thể được nhúng vào một chương trình khách OLE.

### OLE 2.0
OLE 2.0 là sự phát triển tiếp theo của OLE, chia sẻ nhiều mục tiêu giống như phiên bản 1.0, nhưng đã được triển khai lại trên mô hình đối tượng thành phần (COM) thay vì sử dụng trực tiếp VTBL. Các tính năng mới là tự động hóa OLE, kéo và thả, kích hoạt tại chỗ và lưu trữ có cấu trúc. Các biệt danh phát triển từ các tên đối tượng OLE 1, và cung cấp một đối tượng phân cấp và hệ thống đặt tên tài nguyên tương tự như các  URL hoặc URI, vốn được phát minh độc lập. Windows hiện đã hợp nhất hai công nghệ hỗ trợ loại URL Moniker và lược đồ URL Moniker.

### Điều khiển tùy chỉnh OLE
Các điều khiển tùy chỉnh OLE được giới thiệu vào năm 1994 như là một sự thay thế cho các điều khiển mở rộng Visual Basic Extension không được chấp nhận. Thay vì nâng cấp chúng, kiến trúc mới được dựa trên OLE. Đặc biệt, bất kỳ vùng chứa nào hỗ trợ OLE 2.0 đều có thể nhúng các điều khiển tùy chỉnh OLE, mặc dù các điều khiển này không thể phản ứng với các sự kiện trừ khi vùng chứa hỗ trợ điều này. Các điều khiển tùy chỉnh OLE thường được vận chuyển dưới dạng  dynamic link library phần mở rộng.ocx. Năm 1996 tất cả các giao diện điều khiển (ngoại trừ IUnknown) đã được thực hiện tùy chọn để giữ cho kích thước tập tin của điều khiển giảm bớt, để cho chúng sẽ tải xuống nhanh hơn; chúng được gọi là các ActiveX Control.

## Chi tiết kỹ thuật
Các đối tượng OLE và các thùng chứa được thực hiện trên Component Object Model; chúng là các đối tượng có thể thực hiện các giao diện để xuất khẩu các chức năng của chúng. Chỉ giao diện IOleObject là bắt buộc, nhưng các giao diện khác cũng có thể cần phải được thực hiện nếu chức năng mà được xuất bởi các giao diện đó là bắt buộc.

Để dễ hiểu những gì nói sau đây, một số thuật ngữ cần phải được giải thích rõ. Trạng thái xem của đối tượng là liệu đối tượng có trong suốt, mờ đục hoặc mờ đục với nền đồng nhất hay không và liệu đối tượng có hỗ trợ vẽ với một khía cạnh được chỉ định hay không. Trang của một đối tượng là một đối tượng biểu diễn vị trí của đối tượng trong vùng chứa của nó. Một vùng chứa làm nhiệm vụ hỗ trợ nơi lưu trữ đối tượng cho mọi đối tượng được chứa.

Sau đây là danh sách các giao diện, được nhóm theo đối tượng thường cần thực hiện chúng. Các giao diện thường được thực hiện bởi đối tượng OLE thường được gọi bởi thùng chứa OLE và ngược lại. Lưu ý rằng trong danh sách sau thụt đầu dòng chỉ ra việc thừa kế giao diện. Tất cả các giao diện không thụt vào được lấy từ  **[[IUnknown]]**.

### Đối tượng OLE

; DataObject
: Khi được triển khai, cho phép truyền dữ liệu và thông báo thay đổi dữ liệu. Nó phải được thực hiện bởi các đối tượng hỗ trợ việc kéo và thả, được sao chép vào hoặc dán từ clipboard hoặc được liên kết hoặc nhúng vào trong một tài liệu có chứa đối tượng.
; ObjectWithSite
: Cho phép người gọi thông báo cho đối tượng OLE của trang web của nó. Chức năng này cũng được cung cấp bởi**OleObject**, nhưng **ObjectWithSite** có thể được sử dụng, khi được hỗ trợ, nếu **OleObject** không được sử dụng cho các việc khác.
; OleCache
: Cho phép hiển thị trực quan từ **DataObject**được lưu trữ. Điều này cho phép một đối tượng nhúng có thể lưu trữ biểu diễn trực quan của nó, do đó cho phép nó được hiển thị sau này mà không cần phải khởi động ứng dụng đã được sử dụng để tạo đối tượng.
: *Thông thường việc triển khai sẽ lấy nội dung lưu trữ sẵn trong  đối tượng.*
:; OleCache2
:: Cung cấp kiểm soát chi tiết hơn trong bộ nhớ đệm.
:: *Thông thường việc triển khai sẽ lấy nội dung lưu trữ sẵn trong đối tượng.*
; OleCacheControl
: Giao diện này không được gọi bởi vùng chứa, mà được gọi bởi nội bộ của đối tượng cho phép nó nhận thông báo khi **DataObject** đang chạy, do đó cho phép nó đăng ký thông báo thay đổi dữ liệu của đối tượng đó và do đó cho phép nó cập nhật bản trình bày được lưu trữ đúng cách.
: *Thông thường việc triển khai sẽ lấy nội dung lưu trữ sẵn trong đối tượng.*
; OleDocument
: Cho phép đối tượng OLE hỗ trợ nhiều chế độ xem dữ liệu của nó, cũng như một vài hàm liên quan.
; OleDocumentView
: Một đối tượng tài liệu (một đối tượng triển khai **OleDocument**) thực hiện giao diện này cho mỗi lần có yêu cầu xem đối tượng. Nó cho phép người gọi thiết lập trang của đối tượng, truy vấn và thiết lập kích thước của đối tượng và để hiển thị và kích hoạt nó, cũng như một số chức năng liên quan.
; OleWindow
:; OleInPlaceActiveObject
:: Được gọi bởi vùng chứa ngoài cùng của một đối tượng để tương tác với nó trong khi nó hoạt động, ví dụ: để xử lý các phím tăng tốc trong hàng đợi tin nhắn của vùng chứa có nghĩa là cho đối tượng chứa.
:; OleInPlaceObject
:: Được gọi bởi vùng chứa để kích hoạt hoặc hủy kích hoạt đối tượng.
::; IOleInPlaceObjectWindowless
Một đối tượng không cửa sổ là một đối tượng không có cửa sổ riêng của nó, nhưng nó được hiển thị trong cửa sổ của vùng chứa của nó. Nó được container sử dụng để chuyển tiếp các thông báo nhận được bởi cửa sổ của container được thiết kế cho đối tượng chứa. Ví dụ, nếu con chuột được di chuyển qua một cửa sổ, Windows đặt một thông báo di chuyển chuột cùng với các tọa độ chuột trong hàng đợi tin nhắn của cửa sổ. Nếu cửa sổ này chứa các đối tượng nhúng không cửa sổ, thông báo có thể phải được chuyển tiếp đến một đối tượng như vậy nếu các tọa độ của con trỏ chuột nằm trên đối tượng này. Vì lý do tương tự, giao diện này cũng cung cấp quyền truy cập vào giao diện DropTarget của đối tượng
:::.
; OleLink
: Cho phép đối tượng hỗ trợ liên kết, ví dụ: bằng cách cho phép vùng chứa đặt nguồn của đối tượng được liên kết.
: *Thông thường việc triển khai sẽ lấy nội dung triển khai lưu trữ sẵn trong đối tượng*
; OleObject
: Có thể cho rằng đây giao diện quan trọng nhất đối với một đối tượng OLE. Ví dụ, nó cho phép vùng chứa thông báo đối tượng của nó, khởi tạo đối tượng từ dữ liệu, mở và đóng nó, để truy vấn và thiết lập kích thước của đối tượng, yêu cầu thông báo trên AdviseSink của container và thực hiện các đối tượng đã định nghĩa là "động từ" trên đối tượng. Các động từ này thường bao gồm "Mở" hoặc "Chỉnh sửa", nhưng cũng có thể bao gồm các động từ khác. Một trong các động từ được định nghĩa là động từ chính, và nó được thực hiện khi người dùng nhấp đúp vào một đối tượng.
; ViewObject
: Cho phép một đối tượng vẽ chính nó trực tiếp, mà không cần chuyển một **DataObject** vào vùng chứa. Đối với các đối tượng hỗ trợ cả DataObject và giao diện này, các lệnh triển khai dưới đây thường được chia sẻ.
:; ViewObject2
:: Cho phép người gọi truy vấn kích thước của đối tượng.
::; ViewObjectEx
::::Thêm hỗ trợ cho hình hiển thị không bị nhấp nháy của các đối tượng trong suốt, thử nghiệm đối với các đối tượng có hình dạng không đều và thiết lập kích thước của một đối tượng

## Tham khảo

## Liên kết ngoài

* ripOLE - trích xuất tệp đính kèm từ tài liệu OLE
* http://support.microsoft.com/kb/86008 - Microsoft Support