Mặc dù .NET Framework được thiết kếcho mô hình truy xuất dữliệu không-được-kết-nối của 
ADO.NET, bạn vẫn có thểsửdụng các đối tượng ADOnếu cần. Bạn cần thêm một tham chiếu 
đến Microsoft ActiveX Data Objects 2.7 Library(msado15.dll) bằng cách nhắp phải vào dự
án, chọn Add Reference, và chọn thưviện này trong thẻ COM. Khi đó, một tham chiếu đến 
Interop Assembly ADODB.dll(đi kèm với .NET Frameworkvà được cài đặt trong GAC) sẽ
được thêm vào dựán. Tất cảcác đối tượng ADO đều nằm trong không gian tên ADODB. 
Hình 19-1 Chọn Microsoft ActiveX Data Objects 2.7 Library trong cửa sổAdd Reference 
M 
234 
Chương 19: Một sốCOM Interop hữu ích 
Các đối tượng ADOluô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 Recordsetsang một DataSetbằng 
OleDbDataAdapter. Ứng dụng Consoledướ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 
              
            231 
19 
Chương 19: MỘT SỐ COM INTEROP HỮU ÍCH 
232 
233 
Chương 19: Một số COM Interop hữu ích 
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. 
19.1 Sử dụng ADO kinh ₫iển 
V Bạn muốn sử dụng các thư viện truy xuất dữ liệu ADO nhằm tạo sự liên tác với 
một ứng dụng hiện có hoặc bạn muốn truy xuất chức năng nào đó không có hiệu 
lực trong Microsoft ADO.NET. 
# Sử dụng ADO Interop Assembly ADODB.dll (có trong .NET Framework). 
Mặc dù .NET Framework được thiết kế cho mô hình truy xuất dữ liệu không-được-kết-nối của 
ADO.NET, bạn vẫn có thể sử dụng các đối tượng ADO nếu cần. Bạn cần thêm một tham chiếu 
đến Microsoft ActiveX Data Objects 2.7 Library (msado15.dll) bằng cách nhắp phải vào dự 
án, chọn Add Reference, và chọn thư viện này trong thẻ COM. Khi đó, một tham chiếu đến 
Interop Assembly ADODB.dll (đi kèm với .NET Framework và được cài đặt trong GAC) sẽ 
được thêm vào dự án. Tất cả các đối tượng ADO đều nằm trong không gian tên ADODB. 
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 
19.2 Hiển thị trang web với Internet Explorer 
V Bạn muốn hiển thị một trang HTML (hoặc một kiểu tài liệu khác được Internet 
Explorer hỗ trợ) trong một ứng dụng Windows. 
# Sử dụng điều kiểm ActiveX Web Browser đi kèm với Internet Explorer. 
.NET Framework không có điều kiểm nào để thể hiện nội dung HTML. Tuy nhiên, chức năng 
này là cần thiết, để hiển thị nội dung HTML cục bộ nào đó (như một tài liệu trợ giúp đa năng) 
hoặc thông tin nào đó từ web (chẳng hạn, một trang web liệt kê các download mà người dùng 
có thể sử dụng để cập nhật ứng dụng). 
Để hiển thị một trang HTML, bạn có thể thêm một cửa sổ Internet Explorer vào các ứng dụng 
Windows của bạn. Cửa sổ này không chỉ hỗ trợ HTML mà còn hỗ trợ mã JavaScript và Visual 
235 
Chương 19: Một số COM Interop hữu ích 
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 
 ' (Bỏ qua phần mã designer.) 
 Private Sub Form1_Load(ByVal sender As System.Object, _ 
 ByVal e As System.EventArgs) Handles MyBase.Load 
 Explorer.Navigate2("") 
 End Sub 
236 
Chương 19: Một số COM Interop hữu ích 
 Private Sub cmdBack_Click(ByVal sender As System.Object, _ 
 ByVal e As System.EventArgs) Handles cmdBack.Click 
 Try 
 Explorer.GoBack() 
 Catch 
 MessageBox.Show("Already on first page.") 
 End Try 
 End Sub 
 Private Sub cmdForward_Click(ByVal sender As System.Object, _ 
 ByVal e As System.EventArgs) Handles cmdForward.Click 
 Try 
 Explorer.GoForward() 
 Catch 
 MessageBox.Show("Already on last page.") 
 End Try 
 End Sub 
 Private Sub cmdHome_Click(ByVal sender As System.Object, _ 
 ByVal e As System.EventArgs) Handles cmdHome.Click 
 Explorer.GoHome() 
 End Sub 
End Class 
Hình 19-3 Sử dụng điều kiểm Web Browser 
19.3 Vận hšnh Internet Explorer 
V Bạn muốn hiển thị một cửa sổ Internet Explorer độc lập, nhưng vẫn giữ lại quyền 
kiểm soát trên cửa sổ đó. 
# Sử dụng Automation và điều kiểm Microsoft Internet Explorer để vận hành Internet 
Explorer. 
237 
Chương 19: Một số COM Interop hữu ích 
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 
Public Module IETest 
 Public Sub Main() 
 ' Tạo thể hiện IE. 
 Dim IE As New SHDocVw.InternetExplorer() 
 ' Kết nối hàm thụ lý sự kiện. 
 AddHandler IE.NavigateComplete2, AddressOf IE_NavigateComplete2 
 ' Chuyển đến một trang mới. 
 IE.Navigate("") 
238 
Chương 19: Một số COM Interop hữu ích 
 ' Hiển thị cửa sổ. 
 IE.Visible = True 
 Console.WriteLine("Press any key to exit.") 
 Console.ReadLine() 
 Console.WriteLine("Closing the IE window.") 
 IE.Quit() 
 End Sub 
 Public Sub IE_NavigateComplete2(ByVal pDisp As Object, _ 
 ByRef URL As Object) 
 Console.WriteLine("Visited: " & URL.ToString()) 
 End Sub 
End Module 
19.4 Vận hšnh Microsoft Word 
V Bạn muốn tương tác với Microsoft Word, để tự động hóa một tác vụ hoặc để 
đọc/ghi các tài liệu Word. 
# Sử dụng các đối tượng Word Automation đi kèm với Microsoft Office. 
Microsoft cung cấp một mô hình đối tượng đa năng mà bạn có thể sử dụng để tương tác với 
Word và các ứng dụng Office khác. Bạn có thể sử dụng các đối tượng này để tạo và đọc các 
tài liệu Word, tự động hóa các tác vụ phức tạp hay lặp đi lặp lại, và ngay cả truy xuất các tính 
năng của Word như từ điển chính tả. 
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 
[]. 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() 
 ' Thêm một tiêu đề và hai dòng chữ. 
 Dim Range As Word.Range = Doc.Paragraphs.Add().Range 
 Range.InsertBefore("Test Document") 
 Range.Style = "Heading 1" 
 Range = Doc.Paragraphs.Add().Range 
 Range.InsertBefore("Line one." & vbCrLf & "Line two.") 
 Range.Font.Bold = True 
 ' Sử dụng Word làm từ điển. 
 Console.Write("Enter a word to look up: ") 
 Dim TestWord As String = Console.ReadLine() 
 If App.CheckSpelling(TestWord) = False Then 
 Console.WriteLine(TestWord & " is not in the dictionary.") 
 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 
 ' Lưu và đóng tài liệu hiện hành. 
 Doc.SaveAs(App.StartupPath & "\test.doc") 
 Doc.Close() 
 Doc = Nothing 
 ' Bây giờ mở lại tài liệu, hiển thị print-preview, 
 ' và làm cho Word trở nên khả kiến. 
 Doc = App.Documents.Open(App.StartupPath & "\test.doc") 
 Doc.PrintPreview() 
 App.Visible = True 
 ' Hiển thị một vài thông tin. 
 Dim Words As Integer 
 Words = Doc.ComputeStatistics(Word.WdStatistic.wdStatisticWords) 
 Console.WriteLine("This document has " & Words.ToString() & _ 
 " words.") 
 ' Chuyển thành file PDF bằng Adobe Acrobat Distiller. 
 ' Thất bại nếu Adobe Acrobat chưa được cài đặt đầy đủ. 
 Try 
 App.ActivePrinter = "Acrobat Distiller" 
 Console.WriteLine("Press any key to print this document.") 
 Console.ReadLine() 
 Doc.PrintOut() 
 Catch 
 Console.WriteLine("Printer not found.") 
 End Try 
 ' Đóng và thoát Word. 
 Console.WriteLine() 
 Console.WriteLine("Closing Word.") 
 Doc.Close() 
 CType(App, Word._Application).Quit() 
 End Sub 
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. 
Enter a word to look up: huggly 
huggly is not in the dictionary. 
Suggestions include: 
hugely 
ugly 
haggle 
haggy 
This document has 6 words. 
Press any key to print this 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-6 Tạo một tài liệu Word bằng mã lệnh 
19.5 Vận hšnh Microsoft Excel 
V Bạn muốn tương tác với Microsoft Excel, để tự động hóa một tác vụ hoặc để 
đọc/ghi các tài liệu Excel. 
# Sử dụng các đối tượng Excel Automation đi kèm với Microsoft Office. 
Microsoft cung cấp một mô hình đối tượng đa năng mà bạn có thể sử dụng để tương tác với 
Excel, cho phép đọc và ghi các bảng tính và xử lý biểu đồ và các tính năng khác của Excel. Để 
sử dụng Automation với Microsoft Excel, 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 Excel Object Library trong danh sách, và thêm 
nó. Tên chính xác của của các đối tượng Automation tùy thuộc vào phiên bản Excel mà bạn đã 
cài đặt. Excel 2000 sử dụng phiên bản 9.0, trong khi Excel 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 đó. 
Nếu bạn đã cài đặt các Interop Assembly cho Office XP (có tại [ 
com/library/default.asp?url=/downloads/list/office.asp]), chúng sẽ được sử dụng một cách tự 
động. Nếu không, một Interop Assembly mới sẽ được tạo ra. Các đối tượng mà bạn cần sử 
dụng nằm trong không gian tên Excel. 
Ứng dụng dưới đây sẽ tạo một tài liệu Excel mới, thêm vào một vài dữ liệu, tạo một biểu đồ, 
và chép dữ liệu biểu đồ vào một Windows Form. Các bước này được thực hiện với cửa sổ 
Excel hoàn toàn khả kiến, mặc dù bạn có thể thay đổi cách xử lý này bằng cách thiết lập thuộc 
tính Excel.Application.Visible là False. 
Public Class DriveExcelForm 
 Inherits System.Windows.Forms.Form 
 ' (Bỏ qua phần mã designer.) 
242 
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 
 Private Sub Form_Load(ByVal sender As System.Object, _ 
 ByVal e As System.EventArgs) Handles MyBase.Load 
 ' Khởi chạy và hiện Excel. 
 Dim App As New Excel.Application() 
 App.Visible = True 
 ' Tạo một tài liệu mới. 
 Dim Doc As Excel.Workbook = App.Workbooks.Add() 
 Dim Sheet As Excel.Worksheet = Doc.Sheets(1) 
 ' Định dạng các tiêu đề cho bảng. 
 Sheet.Range("A1").Value = "Month" 
 Sheet.Range("B1").Value = "Number of Days" 
 ' 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 
 ' Đổ dữ liệu vào sheet. 
 Dim Days As Integer 
 Dim i As Integer 
 For i = 1 To 12 
 Days = DateTime.DaysInMonth(DateTime.Now.Year, i) 
 Sheet.Range("A" & (i + 1)).Value = _ 
 DateTimeFormatInfo.CurrentInfo.GetMonthName(i) 
 Sheet.Range("B" & (i + 1)).Value = Days 
 Next 
244 
Chương 19: Một số COM Interop hữu ích 
 ' Tạo và định dạng một biểu đồ cột 3D mới. 
 Dim Chart As Excel.Chart = Doc.Charts.Add(, Sheet) 
 Chart.ChartType = Excel.XlChartType.xl3DColumn 
 Chart.SetSourceData(Sheet.Range("A1:B13")) 
 ' Chép biểu đồ vào PictureBox trên form này (sử dụng Clipboard). 
 Chart.ChartArea.Select() 
 Chart.ChartArea.Copy() 
 ' Thu lấy bức hình. 
 Dim ChartImage As Image = _ 
 CType(Clipboard.GetDataObject().GetData(DataFormats.Bitmap), _ 
 Bitmap) 
 ' Co hình cho vừa với form. 
 Dim ScalingRatio As Single = PictureBox1.Width / ChartImage.Width 
 ChartImage = ChartImage.GetThumbnailImage( _ 
 ChartImage.Width * ScalingRatio, _ 
 ChartImage.Height * ScalingRatio, _ 
 Nothing, Nothing) 
 PictureBox1.Image = ChartImage 
 ' Điều chỉnh biểu đồ để nó xuất hiện kế bên bảng Excel, 
 ' thay vì trong một cửa sổ riêng. 
 Chart.Location(Excel.XlChartLocation.xlLocationAsObject, _ 
 "Sheet1") 
 End Sub 
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. 
19.6 Sử dụng MAPI ₫ể gửi th“ng ₫iệp e-mail 
V Bạn muốn gửi một thông điệp e-mail, nhưng SMTP-server (Simple Mail Transfer 
Protocol mail server) chưa được cấu hình trên máy tính hiện hành. 
# Sử dụng thành phần MAPI (Message Application Programming Interface) để tương 
tác với tài khoản mail đã được cấu hình trên máy tính hiện hành. 
MAPI là một giao diện cho phép bạn tương tác với các tính năng gửi/nhận mail được tích hợp 
trong hệ điều hành Windows. Bạn có thể sử dụng MAPI (thông qua API, hoặc thông qua thành 
phần COM) để tương tác với mail-client mặc định (thường là Microsoft Outlook hay Outlook 
Express). Các tác vụ bao gồm lấy thông tin liên hệ từ sổ địa chỉ, lấy các thông điệp trong 
Inbox, và soạn và gửi thông điệp bằng mã lệnh. Bạn cần lưu ý rằng điều kiểm MAPI không đi 
kèm với .NET⎯nó được cài đặt trong các phiên bản trước của Visual Studio, như Visual 
Basic 6. Mặc dù có thể tái phân bổ điều kiểm ActiveX MAPI cùng với các ứng dụng có sử 
dụng nó, bạn cũng sẽ cần có một sản phẩm như Visual Basic 6 để phát triển với nó. 
Để có thể sử dụng MAPI, hãy 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 MAPI Controls 6.0 (msmapi32.ocx) trong danh 
sách, và thêm nó. 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 thuộc không gian tên MSMAPI. 
245 
Chương 19: Một số COM Interop hữu ích 
Hình 19-10 Chọn Microsoft MAPI Controls 6.0 trong cửa sổ Add Reference 
Hình 19-11 Một MAPI mail-client đơn giản 
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 
 ' (Bỏ qua phần mã designer.) 
 Private Sub cmdSend_Click(ByVal sender As System.Object, _ 
 ByVal e As System.EventArgs) Handles cmdSend.Click 
246 
Chương 19: Một số COM Interop hữu ích 
 ' Tạo một phiên làm việc mới. 
 Dim Session As New MSMAPI.MAPISession() 
 ' Vô hiệu giao diện người dùng. 
 Session.LogonUI = False 
 ' Không lấy mail khỏi mail-server. 
 Session.DownLoadMail = False 
 ' Khởi chạy phiên làm việc. 
 Session.SignOn() 
 ' Tạo một thông điệp mới. 
 Dim Messages As New MSMAPI.MAPIMessagesClass() 
 Messages.SessionID = Session.SessionID 
 Messages.Compose() 
 ' Chỉ định một số thông tin. 
 Messages.RecipDisplayName = "
[email protected]" 
 Messages.MsgNoteText = "Hey this is great the MAPI code " & _ 
 "works fine :)" 
 Messages.Send(False) 
 ' Kết thúc phiên làm việc. 
 Session.SignOff() 
 End Sub 
 Private Sub cmdReceive_Click(ByVal sender As System.Object, _ 
 ByVal e As System.EventArgs) Handles cmdReceive.Click 
 ' Tạo một phiên làm việc mới. 
 Dim Session As New MSMAPI.MAPISession() 
 Session.LogonUI = False 
 ' Không lấy mail khỏi mail-server. 
 Session.DownLoadMail = False 
 ' Khởi chạy phiên làm việc. 
 Session.SignOn() 
 ' Đem tất cả các thông điệp trong Inbox về. 
 Dim Messages As New MSMAPI.MAPIMessagesClass() 
 Messages.SessionID = Session.SessionID 
 Messages.Fetch() 
 ' Thêm các thông điệp này vào ListView. 
 Dim i As Integer 
 For i = 0 To Messages.MsgCount - 1 
 Messages.MsgIndex = i 
 Dim lvItem As New ListViewItem(Messages.MsgOrigDisplayName) 
 lvItem.SubItems.Add(Messages.MsgSubject) 
 lvItem.SubItems.Add(Messages.MsgDateReceived) 
 lstInbox.Items.Add(lvItem) 
 Next 
 ' Kết thúc phiên làm việc. 
 Session.SignOff() 
 End Sub 
End Class 
247 
Chương 19: Một số COM Interop hữu ích 
19.7 Chơi file ₫a phương tiện 
V Bạn muốn chơi file video (MPG chẳng hạn) hay file audio (MP3 chẳng hạn). 
# Sử dụng điều kiểm ActiveX MCI, và kết nó vào một PictureBox nếu bạn cần hiển 
thị video. 
.NET Framework không chứa bất kỳ lớp nào dùng để chơi file đa phương tiện (audio hay 
video). Mục 10.14 đã mô tả cách sử dụng Win32 API để chơi file WAV. Sẽ có sẵn nhiều chức 
năng hơn nếu bạn sử dụng điều kiểm ActiveX MCI. Tuy nhiên, điều kiểm này không đi kèm 
với .NET⎯nó được cài đặt trong các phiên bản trước của Visual Studio, như Visual Basic 6. 
Mặc dù có thể tái phân bổ điều kiểm ActiveX MCI cùng với các ứng dụng có sử dụng nó, bạn 
cũng sẽ cần một sản phẩm như Visual Basic 6 để phát triển với nó. 
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 
Hình 19-13 Ứng dụng thử nghiệm điều kiểm MCI 
Public Class VideoForm 
 Inherits System.Windows.Forms.Form 
 ' (Bỏ qua phần mã designer.) 
 Private Sub Form_Load(ByVal sender As System.Object, _ 
 ByVal e As System.EventArgs) Handles MyBase.Load 
 ' Mở file. 
 MMC.FileName = Application.StartupPath & "\test.mpg" 
 MMC.Command = "Open" 
 ' Giấu thanh playback. 
 MMC.Visible = False 
 ' Hiển thị video trong PictureBox. 
 MMC.hWndDisplay = pic.Handle.ToInt32() 
 End Sub 
 Private Sub cmdPlay_Click(ByVal sender As System.Object, _ 
 ByVal e As System.EventArgs) Handles cmdPlay.Click 
 ' Quay về đầu. 
 MMC.Command = "Prev" 
 ' Bắt đầu playback. 
 MMC.Command = "Play" 
 End Sub 
 Private Sub cmdStop_Click(ByVal sender As System.Object, _ 
 ByVal e As System.EventArgs) Handles cmdStop.Click 
 ' Ngừng playback. 
 MMC.Command = "Stop" 
 End Sub 
End Class 
# 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 
19.8 Chơi file flash 
V Bạn muốn chơi file flash (.swf). 
# Sử dụng điều kiểm Shockware Flash Object. 
Để có thể thêm điều kiểm Shockware Flash Object 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 Shockware 
Flash Object (flash.ocx). Như thế, Shockware Flash Object 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-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 
Public Class FlashForm 
 Inheri