Tải bản đầy đủ (.pdf) (26 trang)

Một số Cominterop hữu ích docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (827.68 KB, 26 trang )

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

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.
1
1
9
9
.
.
1
1


S
S




d
d


n
n
g
g


A
A
D

D
O
O


k
k
i
i
n
n
h
h




i
i


n
n


V
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

M
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
1
1
9
9
.
.

2
2


H
H
i
i


n
n


t
t
h
h




t
t
r
r
a
a
n
n

g
g


w
w
e
e
b
b


v
v


i
i


I
I
n
n
t
t
e
e
r
r

n
n
e
e
t
t


E
E
x
x
p
p
l
l
o
o
r
r
e
e
r
r


V
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

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

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


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("http://localhost")
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
1
1
9
9
.
.
3
3


V
V



n
n


h
h
š
š
n
n
h
h


I
I
n
n
t
t
e
e
r
r
n
n
e
e

t
t


E
E
x
x
p
p
l
l
o
o
r
r
e
e
r
r


V
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
1
1
9
9
.
.
4
4


V
V


n
n


h
h
š
š
n
n

h
h


M
M
i
i
c
c
r
r
o
o
s
s
o
o
f
f
t
t


W
W
o
o
r
r

d
d


V
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

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
1
1
9
9
.

.
5
5


V
V


n
n


h
h
š
š
n
n
h
h


M
M
i
i
c
c
r

r
o
o
s
s
o
o
f
f
t
t


E
E
x
x
c
c
e
e
l
l


V
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 [
rosoft.
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

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
.

1
1
9
9
.
.
6
6


S
S




d
d


n
n
g
g


M
M
A
A

P
P
I
I








g
g


i
i


t
t
h
h


n
n
g
g





i
i


p
p


e
e
-
-
m
m
a
a
i
i
l
l


V
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 = ""
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

1
1
9
9
.
.
7
7



C
C
h
h
ơ
ơ
i
i


f
f
i
i
l
l
e
e




a
a


p
p

h
h
ư
ư
ơ
ơ
n
n
g
g


t
t
i
i


n
n


V
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

1
1
9
9

.
.
8
8


C
C
h
h
ơ
ơ
i
i


f
f
i
i
l
l
e
e


f
f
l
l

a
a
s
s
h
h


V
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
Inherits System.Windows.Forms.Form

' (Bỏ qua phần mã designer.)

Private Sub FlashForm_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
axShockwaveFlash1.Movie = Application.StartupPath & _

"\\test.swf"
End Sub

End Class
1
1
9
9
.
.
9
9


S
S




d
d


n
n
g
g





i
i


u
u


k
k
i
i


m
m


M
M
a
a
s
s
k
k
e
e

d
d


E
E
d
d
i
i
t
t


V
V


Bạn muốn có điều kiểm giống như
TextBox
nhưng có thể hạn chế và định dạng dữ
liệu y theo một “mặt nạ”.
#
#


Sử dụng điều kiểm
Masked Edit
.
Điều kiểm

Masked Edit
trông giống như điều kiểm
TextBox
, nhưng nó có các tính năng cao
hơn là “masked input” (đầu vào có-mặt-nạ) và “formatted output” (đầu ra được-định-dạng).
Nếu bạn không sử dụng mặt nạ, điều kiểm
Masked Edit
hoạt động giống như một
TextBox

chuẩn.
Để định nghĩa một mặt nạ, bạn thiết lập thuộc tính
Mask
với một chuỗi. Mặt nạ có thể chứa hai
loại ký tự: placeholder

ứng với các ký tự do người dùng cung cấp, và ký tự trực kiện

được
nhập một cách tự động khi người dùng gõ. Các ký tự trực kiện đóng vai trò là dấu hiệu nhận
biết kiểu của input đang được nhập vào (chẳng hạn các dấu ngoặc đơn bao lấy phần mã vùng
của một số điện thoại). Placeholder quy định tính hợp lệ của đầu vào. Nếu người dùng nhập
vào một ký tự trái với mặt nạ, điều kiểm này phát sinh sự
kiện
ValidationError
, và ký tự đó
sẽ không xuất hiện. Bảng 19-1 cho biết các placeholder mà bạn có thể sử dụng. Để thu lấy
text được-định-dạng hiện có trong điều kiểm, bạn cần sử dụng thuộc tính
Text
.


Bảng 19-1
Các placeholder của điều kiểm Masked Edit
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.
>
Chuyển tất cả các ký tự thành chữ hoa.
<
Chuyển tất cả các ký tự thành chữ thường.
A
Ký tự chữ hay số (bắt buộc). Ví dụ: a–z, A–Z, hay 0–9.
a
Ký tự chữ hay số (tùy chọn).
9
Chữ số (tùy chọn). Ví dụ: 0–9.
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
.
?
Mẫu tự. Ví dụ: a–z hay A–Z.


Để 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 = "###->???-<???"
1
1
9
9
.
.
1
1
0
0


S
S




d
d


n
n
g
g



M
M
i
i
c
c
r
r
o
o
s
s
o
o
f
f
t
t


A
A
g
g
e
e
n
n

t
t


V
V


Bạn muốn ứng dụng của mình có sự trợ giúp của những nhân vật hoạt hình như
trong
Microsoft

Word
,
Microsoft

Excel

#
#


Sử dụng điều kiểm
Microsoft Agent
.
Microsoft Agent
là một kỹ thuật dùng để thêm các nhân vật hoạt hình có tính tương tác vào
ứng dụng hay trang web. Tính tương tác là chức năng chính yếu của kỹ thuật
Microsoft Agent
:

các nhân vật
Microsoft Agent
có thể nói và đáp lại đầu vào của người dùng thông qua việc
nhận dạng và tổng hợp giọng nói.
Microsoft
sử dụng kỹ thuật này trong các ứng dụng như
Word
,
Excel
, và
PowerPoint
; giúp người dùng tìm câu trả lời cho những câu hỏi và hiểu cách
thức hoạt động của ứng dụng.
Microsoft
cung cấp thông tin về kỹ thuật
Microsoft Agent
tại
[
www.microsoft.com/msagent
].

Điều kiểm
Microsoft Agent
cho phép người dùng tương tác với các ứng dụng và trang web
thông qua giọng nói—dạng giao tiếp tự nhiên nhất của con người. Khi người dùng nói vào
micro, điều kiểm này sử dụng một bộ máy nhận dạng giọng nói—đây là ứng dụng dịch âm
thanh đầu vào từ micro thành ngôn ngữ mà máy tính hiểu được. Điều kiểm
Microsoft Agent

cũng sử dụng một bộ máy text-to-speech—đây là ứng dụng dịch các từ do người dùng nhập

vào thành âm thanh có thể nghe được qua loa.
Điều kiểm
Microsoft Agent
cho phép bạn truy xuất bốn nhân vật đã được định nghĩa sẵn—
Genie
(vị thần),
Merlin
(thuật sĩ),
Peedy
(con vẹt) và
Robby
(người máy). Mỗi nhân vật có
một tập các hành động mà bạn có thể sử dụng trong ứng dụng nhằm minh họa các quan điểm
hay chức năng khác nhau. Chẳng hạn, tập các hành động của
Peedy
gồm các dạng bay khác
nhau mà bạn có thể sử dụng để dịch chuyển
Peedy
trên màn hình. Bạn cũng có thể tự tạo cho
mình các nhân vật hoạt hình với sự trợ giúp của
Microsoft Agent Character Editor

Microsoft Linguistic Sound Editing Tool
(có trong đĩa CD đính kèm).
Ví dụ dưới đây minh họa cách xây dựng một ứng dụng đơn giản với điều kiểm
Microsoft
Agent
. Ứng dụng này gồm hai
ComboBox
dùng để chọn một nhân vật và một hành động. Khi

người dùng chọn các
ComboBox
này, nhân vật được chọn sẽ xuất hiện và thực hiện hành động
được chọn. Ứng dụng này sử dụng việc nhận dạng và tổng hợp giọng nói để điều khiển các
hành động của nhân vật: người dùng có thể bảo nhân vật thực hiện hành động bằng cách nhấn
253
Chương 19: Một số COM Interop hữu ích

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

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

Public Class FrmAgent
Inherits System.Windows.Forms.Form

' (Bỏ qua phần mã designer.)

' Đối tượng agent hiện tại.
Private mSpeaker As AgentObjects.IAgentCtlCharacter

' Hàm thụ lý sự kiện KeyDown của txtLocation.
Private Sub txtLocation_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtLocation.KeyDown

If e.KeyCode = Keys.Enter Then
' Thiết lập nơi lưu trữ nhân vật vào txtLocation.
Dim location As String = txtLocation.Text

' Khởi tạo các nhân vật.
Try

' Nạp các nhân vật vào đối tượng agent.
mainAgent.Characters.Load("Genie", location & "Genie.acs")
mainAgent.Characters.Load("Merlin", location & "Merlin.acs")
mainAgent.Characters.Load("Peedy", location & "Peedy.acs")
mainAgent.Characters.Load("Robby", location & "Robby.acs")

254
Chương 19: Một số COM Interop hữu ích

' Vô hiệu txtLocation và kích hoạt các điều kiểm khác.
txtLocation.Enabled = False
txtSpeech.Enabled = True
cmdSpeak.Enabled = True
characterCombo.Enabled = True
actionsCombo.Enabled = True

' 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

' Hàm thụ lý sự kiện Click của nút Speak.
Private Sub cmdSpeak_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdSpeak.Click

' Nếu txtSpeech rỗng, nhân vật nhắc người dùng nhập text vào txtSpeech.
If txtSpeech.Text = "" Then
mSpeaker.Speak("Please type the words you want me to speak", "")
Else
mSpeaker.Speak(txtSpeech.Text, "")
End If
End Sub

' Hàm thụ lý sự kiện Click của agent.
Private Sub mainAgent_ClickEvent(ByVal sender As Object, _
ByVal e As AxAgentObjects._AgentEvents_ClickEvent) _
Handles mainAgent.ClickEvent
mSpeaker.Play("Confused")
mSpeaker.Speak("Why are you poking me?", "")
mSpeaker.Play("RestPose")
End Sub

' Hàm thụ lý sự kiện SelectedIndexChanged củ
a characterCombo
' (người dùng chọn nhân vật mới).
Private Sub characterCombo_SelectedIndexChanged(ByVal _
sender As System.Object, ByVal e As System.EventArgs) _
Handles characterCombo.SelectedIndexChanged
ChangeCharacter(characterCombo.Text)
End Sub

' Ẩn nhận vật hiện tại và hiện nhân vật mới.
Private Sub ChangeCharacter(ByVal name As String)
mSpeaker.Hide(0)
mSpeaker = mainAgent.Characters(name)

GetAnimationNames() ' Sinh lại danh sách hành động.
mSpeaker.Show(0)
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

' Xóa actionsCombo.
actionsCombo.Items.Clear()
mSpeaker.Commands.RemoveAll()

' 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


' Thêm lệnh tùy biến
mSpeaker.Commands.Add("MoveToMouse", "MoveToMouse", _
"Move To Mouse", True, True)
End SyncLock
End Sub

' Hàm thụ lý sự kiện SelectedIndexChanged của actionsCombo
' (người dùng chọn hành động mới).
Private Sub actionsCombo_SelectedIndexChanged(ByVal sender _
As System.Object, ByVal e As System.EventArgs) _
Handles actionsCombo.SelectedIndexChanged
mSpeaker.Stop()
mSpeaker.Play(actionsCombo.Text)
mSpeaker.Play("RestPose")
End Sub

' Hàm thụ lý sự kiện Command của agent.
Private Sub mainAgent_Command(ByVal sender As System.Object, _
ByVal e As AxAgentObjects._AgentEvents_CommandEvent) _
Handles mainAgent.Command
Dim command As AgentObjects.IAgentCtlUserInput = _
CType(e.userInput, AgentObjects.IAgentCtlUserInput)

' Đổi nhân vật nếu người dùng đọc tên nhân vật.
If (command.Voice = "Peedy" OrElse command.Voice = "Robby" OrElse _
command.Voice = "Merlin" OrElse command.Voice = "Genie") Then
ChangeCharacter(command.Voice)
Return
End If


' Gửi agent đến chuột.
If command.Name = "MoveToMouse" Then
mSpeaker.MoveTo(Convert.ToInt16(Cursor.Position.X - 60), _
Convert.ToInt16(Cursor.Position.Y - 60))
Return
End If

' Thực hiện hành động mới.
mSpeaker.Stop()
mSpeaker.Play(command.Name)
End Sub

End Class

×