Академический Документы
Профессиональный Документы
Культура Документы
19
232
233
Chương 19: Một số COM Interop hữu ích
M
ong đợi Microsoft .NET Framework sao lại tất cả các tính năng hiện có trong các
thành phần COM là điều phi thực tế. Trong các chương trước, bạn đã biết cách mở
rộng các chức năng của .NET bằng cách tận dụng các tính năng từ Win32 API,
WMI, và các thành phần COM như Windows Script Host. Chương này sẽ xét một vài tính
năng hữu ích hơn từ thế giới của mã lệnh không-được-quản-lý, bao gồm ADO kinh điển (mục
19.1), các thành phần cho trang web (mục 19.2 và 19.3), các thành phần dùng để tự động hóa
Microsoft Word và Excel (mục 19.4 và 19.5), và những điều kiểm ActiveX cho phim động,
flash, và hộp nhập text có mặt nạ che (mục 19.7, 19.8, và 19.9). Và hơn hết, mặc dù những
điều kiểm và thành phần này tồn tại bên ngoài thư viện lớp .NET, việc hỗ trợ tính liên tác
COM của .NET Framework khiến cho việc sử dụng chúng trở nên mạch lạc.
Hình 19-1 Chọn Microsoft ActiveX Data Objects 2.7 Library trong cửa sổ Add Reference
234
Chương 19: Một số COM Interop hữu ích
Các đối tượng ADO luôn kết nối thông qua OLE DB, cho nên bạn phải sử dụng cú pháp OLE
DB đối với chuỗi kết nối. Bạn có thể thao tác trực tiếp các đối tượng Connection, Command, và
Recordset, và ngay cả có thể chép dữ liệu từ một Recordset sang một DataSet bằng
OleDbDataAdapter. Ứng dụng Console dưới đây sẽ trình bày kỹ thuật này:
Public Module ADOTest
' Chú ý rằng chuỗi kết nối phải sử dụng cú pháp OLE DB.
Private ConnectionString As String = "Provider=SQLOLEDB;" & _
"Data Source=localhost;Integrated Security=SSPI;" & _
"Initial Catalog=Northwind"
Public Sub Main()
' Tạo các đối tượng ADO kinh điển.
Dim ADOCon As New ADODB.Connection()
ADOCon.ConnectionString = ConnectionString
Dim SQL As String = "SELECT * FROM Customers"
Dim Rs As ADODB.Recordset
' Tạo ADO.NET adapter sẽ chuyển dữ liệu Recordset thành một bảng
' trong DataSet. Chú ý rằng chỉ OLE DB provider mới có chức năng này.
Dim Adapter As New System.Data.OleDb.OleDbDataAdapter()
Dim Ds As New DataSet()
Try
' Mở Recordset.
ADOCon.Open()
Rs = ADOCon.Execute(SQL)
' Chép Recordset vào DataSet.
Adapter.Fill(Ds, Rs, "Customers")
Catch Err As Exception
Console.WriteLine(Err.ToString())
Finally
ADOCon.Close()
End Try
Console.WriteLine("Retrieved " & Ds.Tables(0).Rows.Count & _
" rows.")
Console.ReadLine()
End Sub
End Module
Basic Scripting Edition (VBScript), điều kiểm ActiveX, và nhiều plug-ins khác tùy thuộc vào
cấu hình hệ thống của bạn (bao gồm Word, Excel, và Adobe Acrobat Reader). Thực tế, bạn có
thể sử dụng điều kiểm Web Browser để duyệt các thư mục trên một ổ đĩa cục bộ hoặc hiển thị
các file trên một FTP site.
Để có thể thêm Web Browser vào một dự án, nhắp phải vào hộp công cụ và chọn Add/Remove
Items. Kế tiếp, chọn thẻ COM Components, và chọn Microsoft Web Browser (shdocvw.dll).
Theo đó, điều kiểm Explorer được thêm vào hộp công cụ của bạn. Khi bạn thả điều kiểm này
lên form, các Interop Assembly cần thiết sẽ được tạo ra và thêm vào dự án của bạn.
Hình 19-2 Chọn Microsoft Web Browser trong cửa sổ Customize Toolbox
Khi sử dụng Web Browser, bạn sẽ thường dùng các phương thức sau đây:
• Navigate⎯chuyển đến URL do bạn chỉ định.
• GoBack và GoForward⎯chuyển đến các trang trong history.
• GoHome⎯chuyển đến trang home trên máy tính hiện hành, và GoSearch⎯hiển thị trang
tìm kiếm.
Ngoài ra, người dùng sẽ có thể thực hiện chuyển hướng (navigation) bằng cách nhắp vào các
liên kết trang (nếu chúng tồn tại). Bạn có thể lấy URL hiện hành từ thuộc tính LocationURL và
xác định điều kiểm vẫn còn xử lý trang đó hay không bằng cách xét thuộc tính Busy. Ngoài ra,
bạn có thể phản ứng với nhiều sự kiện khác nhau.
Public Class Form1
Inherits System.Windows.Forms.Form
End Class
Microsoft cung cấp nhiều cách để truy xuất các chức năng của Internet Explorer. Bạn có thể
đặt trực tiếp một cửa sổ trình duyệt Internet Explorer lên form, như đã trình bày trong mục
19.2, hoặc bạn có thể sử dụng Automation để vận hành một cửa sổ Internet Explorer độc lập.
Trong cả hai trường hợp, mô hình đối tượng hầu như giống nhau.
Để sử dụng Automation với Internet Explorer, trước tiên bạn phải thêm một tham chiếu đến
thư viện COM cần thiết. Nhắp phải vào dự án của bạn trong Solution Explorer, chọn Add
Reference, và chọn thẻ COM. Tìm Microsoft Internet Controls (shdocvw.dll) trong danh sách,
và thêm nó. Các Interop Assembly cần thiết sẽ được tạo ra và thêm vào dự án của bạn ngay
sau đó.
Như với điều kiểm Web Browser, bạn có thể chuyển cửa sổ đến các URL khác nhau và thụ lý
các sự kiện chuyển hướng (navigation). Ngoài ra, bạn có thể điều khiển cửa sổ là khả kiến hay
không (bằng cách thiết lập thuộc tính Visible), và bạn có thể đóng cửa sổ bằng cách gọi Quit.
Ứng dụng Console dưới đây mở một cửa sổ Internet Explorer độc lập để hiển thị một URL
được chỉ định. Kế đó, nó thụ lý sự kiện NavigateComplete2, hiển thị các URL mới khi người
dùng truy xuất chúng. Bạn có thể đóng cửa sổ Internet Explorer bằng cách nhấn Enter trong
cửa sổ Console.
Hình 19-4 Chọn Microsoft Internet Controls trong cửa sổ Add Reference
End Module
Hình 19-5 Chọn Microsoft Word Object Library trong cửa sổ Add Reference
239
Chương 19: Một số COM Interop hữu ích
Để sử dụng Automation với Microsoft Word, trước tiên bạn phải thêm một tham chiếu đến thư
viện COM cần thiết. Nhắp phải vào dự án của bạn trong Solution Explorer, chọn Add
Reference, và chọn thẻ COM. Tìm Microsoft Word Object Library trong danh sách, và thêm
nó. Tên chính xác của đối tượng Automation này tùy thuộc vào phiên bản Word mà bạn đã cài
đặt. Word 2000 sử dụng phiên bản 9.0, trong khi Word 2002 (có trong Office XP) sử dụng
phiên bản 10. Các Interop Assembly cần thiết sẽ được thêm vào dự án của bạn ngay sau đó.
Các đối tượng này nằm trong không gian tên Word.
# Bạn có thể trực tiếp download các Interop Assembly cho Office XP từ Microsoft
[http://msdn.microsoft.com/library/default.asp?url=/downloads/list/office.asp]. Các
assembly .NET này bọc các thành phần COM Office và có cải tiến đôi chút để mô
hình đối tượng Office dễ sử dụng trong một ứng dụng .NET. Một khi bạn đã
download các assembly này và cài đặt chúng trong GAC, chúng sẽ được sử dụng
tự động khi bạn thêm một tham chiếu đến bất kỳ thành phần COM Office nào.
Ứng dụng Console dưới đây sử dụng các đối tượng Word Automation theo nhiều cách khác
nhau. Nó sẽ tạo một tài liệu phía nền, thực hiện kiểm tra chính tả, hiển thị một vài thông tin về
tài liệu, hiển thị print-preview, và in tài liệu một cách tự động.
Public Module DriveWord
Public Sub Main()
' Khởi động Word phía nền.
Dim App As New Word.Application()
App.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone
' Tạo một tài liệu mới (không khả kiến đối với người dùng).
Dim Doc As Word._Document = App.Documents.Add()
Console.WriteLine()
Console.WriteLine("Creating new document.")
Console.WriteLine()
Range = Doc.Paragraphs.Add().Range
Range.InsertBefore("Line one." & vbCrLf & "Line two.")
Range.Font.Bold = True
Console.WriteLine("Suggestions include:")
Dim Suggestion As Word.SpellingSuggestion
For Each Suggestion In App.GetSpellingSuggestions(TestWord)
Console.WriteLine(Suggestion.Name)
Next
Else
Console.WriteLine(TestWord & " is in the dictionary.")
End If
Console.WriteLine()
240
Chương 19: Một số COM Interop hữu ích
End Module
Kết xuất của ứng dụng này có thể như dưới đây. Hình 19-6 là tài liệu Word được sinh ra.
Creating new document.
Closing Word.
# Để có thể gỡ rối với cửa sổ Word một cách trực quan, bạn hãy thiết lập thuộc tính
Word.Application.Visible là True. Khi đã hoàn thiện phần mã lệnh, bạn có thể
giấu cửa sổ này đi để người dùng không thể can thiệp vào đó.
241
Chương 19: Một số COM Interop hữu ích
Hình 19-7 Chọn Microsoft Excel Object Library trong cửa sổ Add Reference
Hình 19-8 Tạo một tài liệu Excel (với một biểu đồ)
243
Chương 19: Một số COM Interop hữu ích
Hình 19-9 Chép một biểu đồ Excel vào một Windows Form
' Biểu thức 1:1 chọn tất cả các ô trong hàng đầu tiên.
Sheet.Range("1:1").Font.Size = 12
Sheet.Range("1:1").Font.Bold = True
Sheet.Range("1:1").RowHeight = 20
' Biểu thức A:A chọn tất cả các ô trong cột đầu tiên.
Sheet.Range("A:A").ColumnWidth = 20
Sheet.Range("B:B").ColumnWidth = 20
' Chép biểu đồ vào PictureBox trên form này (sử dụng Clipboard).
Chart.ChartArea.Select()
Chart.ChartArea.Copy()
PictureBox1.Image = ChartImage
End Class
Hình 19-8 trình bày dữ liệu và biểu đồ Excel được tạo tự động. Hình 19-9 trình bày biểu đồ
sau khi được chép vào ứng dụng Windows.
Hình 19-10 Chọn Microsoft MAPI Controls 6.0 trong cửa sổ Add Reference
Mail-client trong hình 19-11 sử dụng MAPI để tải các thông điệp trong Inbox và gửi một
thông điệp thử nghiệm.
Mã lệnh cần tạo và đăng nhập vào một phiên làm việc MAPI bằng đối tượng MAPISession, và
rồi truy xuất các dịch vụ mail thông qua một đối tượng MAPIMessagesClass.
Public Class EmailClient
Inherits System.Windows.Forms.Form
End Class
247
Chương 19: Một số COM Interop hữu ích
Hình 19-12 Chọn Microsoft Multimedia Control version 6.0 trong cửa sổ Customize Toolbox
Để có thể thêm điều kiểm MCI vào dự án, bạn hãy nhắp phải vào hộp công cụ và chọn
Add/Remove Items. Kế đó, vào thẻ COM Components, và chọn Microsoft Multimedia Control
(mci32.ocx). Như thế, MMControl sẽ được thêm vào vào hộp công cụ. Khi bạn thả điều kiểm
này lên form, các Interop Assembly cần thiết sẽ được sinh ra và được thêm vào dự án.
Điều kiểm MCI xuất hiện trên form ở dạng một thanh điều khiển playback. Thông thường,
những điều khiển này sẽ là ẩn đối với người dùng. Mã ứng dụng của bạn có thể tương tác với
điều kiểm MCI để bắt đầu và ngừng playback. Bạn thực hiện các hành động như mở một file,
chơi nó… bằng cách thiết lập thuộc tính Command của điều kiểm với một chuỗi hành động
(action string) như Open hay Play.
Hình 19-13 cho thấy một minh họa đơn giản của điều kiểm MCI (thêm vào hai nút playback
tùy biến).
Khi form nạp, một file MPEG mẫu được mở, và một PictureBox được kết với điều kiểm này.
Kế đó, thuộc tính Command được sử dụng để bắt đầu và ngừng playback.
248
Chương 19: Một số COM Interop hữu ích
# Nếu cần những khả năng đa phương tiện rộng hơn, bạn có thể sử dụng Windows
Media Player 9 Series Software Development Kit (download tại [http://
www.microsoft.com/downloads]). Microsoft cũng cung cấp một bộ công cụ DirectX
được-quản-lý phục vụ cho việc phát triển đa phương tiện tham vọng hơn.
249
Chương 19: Một số COM Interop hữu ích
Hình 19-14 Chọn Shockware Flash Object trong cửa sổ Customize Toolbox
Hình 19-15 Ứng dụng thử nghiệm điều kiểm Shockware Flash Object
250
Chương 19: Một số COM Interop hữu ích
End Class
Ký tự Mô tả
# Chữ số.
Dấu thập phân. Ký tự thực sự được sử dụng là ký tự được chỉ định làm
. dấu thập phân trong các thiết lập bản địa hiện hành. Ký tự này được xem
như một trực kiện.
Dấu phân cách hàng nghìn. Ký tự thực sự được sử dụng là ký tự được chỉ
, định làm dấu phân cách hàng nghìn trong các thiết lập bản địa hiện hành.
Ký tự này được xem như một trực kiện.
Dấu phân cách giờ. Ký tự thực sự được sử dụng là ký tự được chỉ định
: làm dấu phân cách giờ trong các thiết lập bản địa hiện hành. Ký tự này
được xem như một trực kiện.
251
Chương 19: Một số COM Interop hữu ích
Dấu phân cách ngày. Ký tự thực sự được sử dụng là ký tự được chỉ định
/ làm dấu phân cách ngày trong các thiết lập bản địa hiện hành. Ký tự này
được xem như một trực kiện.
Xem ký tự kế tiếp trong chuỗi mặt nạ là một trực kiện. Điều này cho phép
\ bạn chèn các ký tự #, &, A, và ? vào trong chuỗi mặt nạ. Ký tự này được
xem như một trực kiện.
& Ký tự. Các giá trị hợp lệ là các ký tự ANSI trong tầm: 32–126 và 128–255.
C
Ký tự hay space (tùy chọn). Làm việc giống y như &, và bảo đảm tương
thích với Microsoft Access.
Để có thể thêm điều kiểm Masked Edit vào dự án, bạn hãy nhắp phải vào hộp công cụ và chọn
Add/Remove Items. Kế tiếp, vào COM Components, và chọn Microsoft Masked Edit Control
(msmask32.ocx). Như thế, MaskedEdBox sẽ được thêm vào hộp công cụ. Khi bạn thả điều kiểm
này lên form, những Interop Assembly cần thiết sẽ được sinh ra và được thêm vào dự án.
Hình 19-16 Chọn Microsoft Masked Edit Control version 6.0 trong cửa sổ Customize Toolbox
252
Chương 19: Một số COM Interop hữu ích
Hình 19-17 Ứng dụng thử nghiệm điều kiểm Masked Edit
Đoạn mã dưới đây ấn định một mặt nạ bao gồm các chữ số và các mẫu tự được viết
hoa/thường, được phân cách bởi dấu gạch nối:
' Hộp này lưu giữ những dữ liệu như 123-ABC-abc.
EditBox.Mask = "###->???-<???"
phím [Scroll Lock] và rồi đọc tên hành động vào micro. Ví dụ này cũng cho phép người dùng
chuyển sang một nhân vật mới bằng cách gọi tên nhân vật, và còn tạo thêm một lệnh tùy biến
là MoveToMouse. Ngoài ra, nhân vật cũng sẽ đọc bất cứ text nào mà người dùng nhập vào
TextBox. Trước khi chạy ví dụ này, bạn phải cài đặt điều kiểm Microsoft Agent, bộ máy nhận
dạng giọng nói, bộ máy text-to-speech, và các định nghĩa nhân vật (có trong đĩa CD đính
kèm).
Để có thể thêm điều kiểm Microsoft Agent vào dự án, bạn hãy nhắp phải vào hộp công cụ và
chọn Add/Remove Items. Kế đó, vào thẻ COM Components, và chọn Microsoft Agent 2.0.
Như thế, Microsoft Agent sẽ được thêm vào vào hộp công cụ. Khi bạn thả điều kiểm này lên
form, các Interop Assembly cần thiết sẽ được sinh ra và được thêm vào dự án.
Hình 19-18 Chọn Microsoft Agent Control 2.0 trong cửa sổ Customize Toolbox
' Thiết lập nhân vật hiện tại là Merlin và hiện nhân vật này.
mSpeaker = mainAgent.Characters("Merlin")
GetAnimationNames() ' Thu lấy danh sách hành động.
mSpeaker.Show(0)
Catch fileNotFound As FileNotFoundException
MessageBox.Show("Invalid character location", "Error", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If
End Sub
' Thu lấy tên các hành động và đưa vào actionsCombo.
Private Sub GetAnimationNames()
' Bảo đảm tính an toàn về tiểu trình.
SyncLock (Me)
' Lấy tên các hành động.
Dim enumerator As IEnumerator = _
255
Chương 19: Một số COM Interop hữu ích
mainAgent.Characters.Character( _
mSpeaker.Name).AnimationNames.GetEnumerator()
Dim voiceString As String
' Thêm tất cả các hành động (cho phép ra lệnh bằng giọng nói).
While enumerator.MoveNext()
voiceString = Convert.ToString(enumerator.Current)
voiceString = voiceString.Replace("_", "underscore")
actionsCombo.Items.Add(enumerator.Current)
mSpeaker.Commands.Add(Convert.ToString(enumerator.Current), "", _
voiceString, True, False)
End While
End Class
256
Chương 19: Một số COM Interop hữu ích