VietSoftT3 - Phần mềm Việt
Liên kết  
  Home
  Phần mềm Việt khác
  Hỗ trợ lập trình
  Góc thư giản
  Đánh giá
  Diễn đàn
  Liên hệ
  Góp ý
Diễn đàn
=> Not registered yet?

Nơi giao lưu, trao đổi giữa các thành viên.

Diễn đàn - Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB (tiếp theo)

You are here:
Diễn đàn => Thảo luận về lập trình VB6 => Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB (tiếp theo)

<-Back

 1 

Continue->


rubicolort3
(11 posts so far)
06/04/2008 4:15am (UTC)[quote]
[align=center][size=150]Kỳ 4: Hướng dẫn tạo DLL qua ví dụ nhỏ.[/size][/align]
Giả sử tôi có 1 số hàm lệnh sau đây, tôi muốn dùng chung các hàm lệnh này cho các chương trình của tôi sau này, nên tôi xây

dựng một ActiveX DLL.
- Chụp ảnh màn hình
- Đặt Form lên vị trí trên cùng (OnTop)
Ở đây, mình lấy ví dụ là 4 mẹo vặt trong VBLib của diễn đàn.
Các bước tiến hành như sau, tuân theo các quy trình ở các kỳ trước đã nói. Các bạn nên áp dụng khuôn mẫu như mình trình bày

để dễ tiện quản lý và sửa đổi khi cần. Đó cũng là 1 mẹo vặt để viết Code cho chương trình.

Bước 1: Tạo 1 dự án ActiveX DLL mới

Bước 2: Thêm 1 Module (Name: mAPI), 1 Class (Name cFunction). Tạo Module để chứa các hàm API và các kiểu

dữ liệu, hằng khai báo dùng chung. Tạo 1 Class để chứa 4 hàm để nêu trên. Đặt thuộc tính Instancing = MultiUse (Xem

lại các kỳ trước về chức năng của thuộc tính này)

Bước 3: Mở Module mình vừa tạo ra, thêm các dòng sau:
[vb]
Option Explicit
' ----------------------- Khai bao hang ---------------------------
' Hang su dung cho ham chup cua so man hinh
Public Const VK_SNAPSHOT As Byte = &H2C

' Hang su dung cho ham FormOnTop
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOACTIVATE = &H10
Public Const SWP_SHOWWINDOW = &H40
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
' ----------------------- Ket thuc khai bao -----------------------

' ----------------------- Khai bao API ----------------------------
' Ham API su dung cho ham chup cua so man hinh
Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal

dwExtraInfo As Long)

' Ham API su dung cho ham Dat Form tren cung
Public Declare Function SetWindowPos& Lib "user32" (ByVal Hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long,

ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
Public Declare Function SetForegroundWindow Lib "user32" (ByVal Hwnd As Long) As Long
' ---------------------- Ket thuc khai bao ------------------------
[/vb]

Bước 4: Xong thằng Module, giờ ta mở thằng Class cFunction lên, và thêm vào 2 hàm sau.
Ở bước này, bạn nên đọc kỹ ghi chú có trong hàm FormOnTop, đó cũng là 1 đặc tính rất quan trọng mà mình quên đề cập ở các

kỳ trên (Sorry )

[vb]
Option Explicit

Public Function CaptureScreen() As StdPicture
On Error GoTo loi
Call keybd_event(VK_SNAPSHOT, 0, 0, 0)
DoEvents
Set CaptureScreen = Clipboard.GetData(vbCFBitmap)
loi:
End Function

Public Function FormOnTop(ByVal Hwnd As Long, Optional ByVal bTopMost As Boolean = True) As Long
' Chu y: Ban co thay minh dat khoa Optional truoc tu Byval khong
' Tac dung cua tu khoa nay: Minh muon mac dinh cho bien bTopMost la True, neu
' nguoi dung khong truyen gia tri cho no
' Co the nguoi ta goi: Call FormOnTop (Me.Hwnd) = Call FormOnTop(Me.Hwnd, True)

On Error GoTo loi
Dim f As Long, p As Long
f = SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE Or SWP_SHOWWINDOW
Select Case bTopMost
Case True
p = HWND_TOPMOST
Case False
p = HWND_NOTOPMOST
End Select
SetWindowPos Hwnd, p, 0, 0, 0, 0, f
FormOnTop = 1
loi:
FormOnTop = 0
End Function
[/vb]

Bước 5: Thế là phần khung sườn cho thư viện của bạn đã hoàn chỉnh, công việc của bạn chỉ là Complete ra để

dùng thui. Vào Menu File --> Make [Tên Project].Dll
Ở bước này, bạn xem thêm về cách biên dịch ra thư viện ở kỳ thứ 5

Bước 6: Sử dụng thư viện mình vừa tạo thế nào. Cách làm đơn giản, thực hiện theo các bước nhỏ dưới đây
+ Add thư viện của mình vào 1 Project bất kỳ thông qua chức năng References (Project --> References)
+ Sau khi Add xong, khai báo biến trỏ đến 1 trong những Class có trong thư viện, ở đây là liên kết đến Class cFunction
[vb]
Option Explicit
' Khai bao ham tro den Class cFunction
Dim cF as New cFunction

Private Sub Form_Load()
' Goi va thuc hien Ham FormOnTop co trong Class cFunction
cF.FormOnTop Me.Hwnd
End Sub
[/vb]

Bước 7: Hết --> mời các bạn đọc tiếp kỳ 5 và 6, mình sẽ hướng dẫn chi tiết cách biên dịch và sử dụng thư viện.

http://rubicolort33.googlepages.com/ViduDLL.rar
rubicolort3
(11 posts so far)
06/04/2008 4:16am (UTC)[quote]
[align=center][size=150]Kỳ 5: Hướng dẫn các thao tác liên quan đến biên dịch ActiveX DLL hiệu quả.[/size][/align]Sau khi bạn hoàn thành khung sườn các mã lệnh, bước tiếp theo là biên dich chương trình thành 1 file ActiveX DLL thực thụ.
Nhưng trước khi biên dịch, cần trải qua bước kiểm tra lỗi chương trình và Debug kịp thời.

Một số lỗi hay mắc phải khi làm, mình có thể nói tóm lượt như sau:
+ Lỗi do trùng tên hàm, tên biến, tên hàm API, tên hằng, kiểu dữ liệu tự định nghĩa (nếu thư viện của bạn lớn thì dễ mắc lắm, chính vì thế phải có sự sắp xếp để nắm bắt)


+ Lỗi do không tương thích phạm vi khai báo giữa hàm, thủ tục với các kiểu dữ liệu tự định nghĩa. Lỗi này ở kỳ 2 mình đã hướng dẫn cặn kẽ, phần chú ý, nến đọc kỹ sẽ không mắc phải.
+ Lỗi do không tương thích giữa phạm vi hoặc động của Class với kiểu dữ liệu (Mình cũng đã nói ở các kỳ trên)


+ Không có lỗi xuất hiện, nhưng kết quả không ra như ý mình. Cái này cũng rất hay mắc phải đối với các chương trình lớn do tính tương thích giữa các hàm, lệnh API và kiểu dữ liệu tự định nghĩa dùng chung, khi mà khai báo ở các Module. Cách sửa lỗi này rất khó, nhưng mình đang hướng dẫn ở mức cơ bản nhất có thể, nên sẽ không xuất hiện.
+ ...
+ Một số lỗi thông dụng khác khi lập trình trên VB (Sao mà kể cho hết được)

Cách rà soát và sửa lỗi
+ Để công việc rò soát lỗi chính xác và hiệu quả. Bạn nên đặt từ khóa Option Explicit ở đầu mỗi Module, Class, Form ,...
+ Cách nhanh nhất, nhấn CTRL + F5
+ Hoặc là chọn File --> Make [Tên Project].Dll
+ Nếu phát hiện lỗi, đầu tiên là đọc dòng thông báo để biết lỗi như thế nào mà sửa chứ. Nếu đọc không hiểu, vào Help mà tìm hiểu, hoặc vào diễn đàn nhờ giúp đỡ.
+ Nếu mắc lỗi 1 (ở trên), thì cách sửa là dùng công cụ Find để tìm những tên hàm, hằng, kiểu bị trùng, so sánh và bỏ bớt đi 1 cái
Nếu mắc lỗi 2 (ở trên), thì sửa lại các từ khóa Public/Private cho phù hợp
Nếu mắc lỗi 3 (ở trên), thì hoặc cũng sửa lại khóa Public/Private, hoặc thay đổi thuộc tính Instancing của Class cho phù hợp
+ Còn nếu biết lỗi mà không biết sửa --> botay.com --> cũng vào diễn đàn mà nhờ giúp chứ sao.
+ Còn nếu bạn là người siêng, muốn tìm cách sửa lỗi mà không nhờ người khác giúp, thì tự Debug lấy. Trong VB có sẵn các công cụ để mình Debug và kiểm tra kết quả khá chính. Chỉ cần xác định vị trí gặp lỗi, khoanh vùng (tức xác định các hàm, kiểu dữ liệu liên quan đến chỗ bị lỗi ở trong hàm nào, trước sau có dòng lệnh nào), sử dụng chế độ chạy từng dòng lệnh (F, ... Về vấn đề Debug này, mình xin hẹn ở 1 Topic khác ở lẫn sau vậy.

Thiết đặt thông số cho thư viện của mình
Bạn vào Menu Project --> [Tên Project] Properties ...

Ở Tab General:
+ Ô Project Name: Tên thư viện của mình
+ Ô Project Description: Chú thích cho thư viện của mình.
Ở Tab Make:
+ Lần lượt đặt phiên bản của thư viện vào các ô ở Frame Version Number. Nếu muốn tự động tăng phiên bản mỗi lần Compile chương trình thì chọn Check [i]Auto Increment[i/]
+ Lần lượt đặt các giá trị vào các phần tử tương ứng trong Frame Version Information để hiển thị thông tin về tập tin ActiveX DLL sau khi tạo.
+ Ô Conditional Compilation Arguments: đặt điều kiện Complie (Bỏ qua, bởi cái này chưa cần phải biết cũng chẳng sao, đây là hướng dẫn cơ bản mà
Ở Tab Compile: Có 2 cơ chế Compile.
+ P-Code: tốc độ Compile nhanh, dung lượng file Compile nhỏ hơn, nhưng tốc độ xử lý khi chạy chương trình thì chậm, dễ bị các chương trình khác DeCompile lại
+ Native Code: tốc độ Compile chậm (nếu chương trình lớn thì hơi rùa, chịu khó chờ xíu), dung lượng file Compile phình ra khá nhiều, nhưng bù lại tốc độ xử lý khi chạy chương thì nhanh, khó bị các chương trình khác Decompile lại.
Ở Tab Component: Chú ý đến 3 chế độ Version Compatibility (Tức khả năng thích ứng với phiên bản)
+ No Compatibility: Ở chế độ không tương thích phiên bản cũ và mới của ActiveX DLL sau khi Compile. Mỗi lần Compile lại, thì các Project của VB mà có sử dụng nó sẽ không hiểu nó chính là cái cũ mà được nâng cấp lên đâu.
+ Project Compatibility, Binary Compatibility: Tương thích phiên bản cũ và mới, không có hiện tượng không nhận ra nhau mỗi khi Compile như đã nói ở trên. Riêng ở phần Binary Compatibility thì khả năng tương thích mạnh hơn, khi Compile nó có thể đưa ra bản so sánh với bản cũ, hỏi xem mình có nên thay đổi (kiểm tra lỗi ấy mà không? Thay đổi đó có thể sẽ không phù hợp với các chương trình sử dụng bản cũ.

Cuối cùng là công việc Compile ra file DLL để dung
Công việc rất ư là đơn giản, vào menu File --> chọn Make [Tên Project].DLL

* Chúc thành công
rubicolort3
(11 posts so far)
06/04/2008 4:16am (UTC)[quote]
Đấy chính là 1 trong những cách khai báo khi sử dụng đối với ActiveX DLL. Các bạn có thể tham khảo cách sử dụng mình đã viết kỹ trong tập tin Help của VietDLL.

[align=center][size=150]Kỳ 6: Các cách khai báo và sử dụng ActiveX DLL[/size][/align]

Cách 1: Add trực tiếp vào chương trình để sử dụng (Sử dụng được cho cả DLL và OCX)

Trong Project của bạn, chọn Menu Project --> References (hoặc phím tắt CTRL + T)
- Nếu thư viện đã được đăng ký với Window, thì tên của nó sẽ được hiển thị trong List danh sách
[img]www36.websamba.com/chuyenlqd/References.JPG[/img]
- Còn nếu chưa có trong danh sách, có nghĩa là thư viện chưa được đăng ký, thì làm theo bước sau:
+ Nhấn nút Browse..., rùi chọn File VietDLL bạn đã tải về
+ Khi đó, chương trình sẽ Add nó vào List bên cạnh. Nhiệm vụ của bạn là đánh dấu nó và OK

Sau khi Add vào Project, công việc của ta giờ chỉ là khai báo để sử dụng nó thui. Cách khai báo đối với cách này như sau:
+ Mỗi Class bạn tạo ra trong thư viện của mình tương đương với 1 đối tượng chứa các hàm lệnh. Để truy cập đến các hàm lệnh trong Class này, phải khai báo biến đến Class đó. Cách khai báo:
[vb]DIM As New
Ví dụ: Dim Obj As New Object_Window
[/vb]
+ Nếu Class đó có các sự kiện mà bạn muốn sử dụng, thì phải khai báo theo cách này:
[vb]Dim WithEvents As [/vb]
Và trước khi gọi thủ tục, hàm lệnh trong Class này, phải đặt thêm lệnh sau thì mới có hiệu lực, nếu ko sẽ phát sinh lỗi
[VB]Set = New
Ví dụ 1:
[vb]
Option Explicit
Dim WithEvents ws As Winsock
Private Sub Form_Load()
Set ws = New Winsock
End Sub
[/vb]

Công thức gọi hàm sử dụng, thao tác gọi hàm:
[vb]
' Nếu là thủ tục
Call . (,)
' Nếu là hàm
= . (,)
[/vb]

Ví dụ 2:
[vb]
Dim Dlg As New VietDLL.Dialog
Dlg.Flags = cdlOFNAllowMultiselect
Dlg.ShowOpen
[/vb]
Vì sử dụng cách khai báo đầu nên sẽ được VB hỗ trợ đầy đủ như hiển thị danh sách tên hàm, thuộc tính (mỗi khi ta bấm dấu "." sau biến Dlg) và hiển thị các tham số của nó. Với cách khai báo như thía, thì sử dụng không khó chút nào !


Cách 2: Khai báo biến trực tiếp đến VietDLL như 1 COM (Chỉ sử dụng đối với ActiveX DLL)

- Đầu tiên, phải xác định đúng tên của thư viện (Không phải là tên hiển thị trong danh sách ở hình trên, hầu hết là tên của tập tin thư viện)
- Thứ hai, xác định đúng tên của Class.
Tại sao phải xác định 2 điều kiện trên. Bởi vì cách khai báo này trong Add thư viện vào chương trình nên ko được VB hỗ trợ hiển thị tên tự động, vì thế bạn phải nắm rõ nếu ko sẽ xảy ra lỗi
Công thức khai báo như sau:
[vb]
Dim As Object
Set = CreateObject("."
[/vb]
Chú ý: + Có dấu "
+ Có thể thay kiểu Object thành kiểu Variant

Ví dụ 3:
[vb]
Option Explicit
Dim Dlg As Object
Private Sub Form_Load()
Set Dlg = CreateObject("VietDLL.Dialog"
Dlg.MsgboxV "Vi du mau"
End Sub
[/vb]

Công thức gọi hàm sử dụng, thao tác gọi hàm (tương tự cách 1):
[vb]
' Nếu là thủ tục
Call . (,)
' Nếu là hàm
= . (,)
[/vb]

Và sau cùng thì phải xóa nó để tiết kiệm bộ nhớ !
[vb]
Set = Nothing
[/vb]

Cách này thì rất khó khăn trong việc gọi hàm và gán thuộc tính, bởi VB sẽ không hiện sẵn danh sách cho mình đâu, bắt buộc phải nhớ chính xác tên, các tham số, các thuộc tính, các giá trị Enum, ... Vì thía phải có tài liệu đi kèm thì mới có thể sử dụng nó
Ví dụ, ở cách này thì trong thuộc tính Flags, phải nhớ cdlOFNAllowMultiselect = 512 và gán cho nó !
Ví dụ 4:
[vb]
Dim Dlg As Variant
Set Dlg = CreateObject("VietDLL.Dialog"
Dlg.Flags = 512
Dlg.ShowOpen
Set Dlg = Nothing
[/vb]

So sánh ưu và nhược điểm của 2 cách khai báo và sử dụng đối với ActiveX DLL
Cách 1:
+ Ưu điểm: Nếu sử dụng cách này bạn sẽ được hỗ trợ đầy đủ trong lúc sử dụng Hàm, như hiển thị danh sách hàm nè, danh sách Enum có sẵn nè, và rất nhiều, thuận lợi cho những ai chưa biết các hàm có trong thư viện vì thía nó có tính chất dễ sử dụng.
+ Nhược điểm: Thao tác thêm vào khá dài so với cách 2. mỗi lần sử dụng phiên bản mới hơn của thư viện, bạn lại phải Comple lại chương trình của mình đấy. Cái này nó mang tính chất khó khăn về khai báo.
Cách 2:
+ Ưu điểm: rất dễ khai báo, chỉ cần 2 dòng khai báo, và cũng không cần Comple lại chương trình mỗi khi cập nhập phiên bản thư viện mới.
+ Khuyết điểm: không được VB hỗ trợ hiện sẵn tên hàm cùng các tham số của nó, không có sẵn các giá trị Enum để dùng. Khi sử dụng cách này thì bắt buộc phải có tài liệu hướng dẫn đi kèm để biết chính xác các hàm mà dùng, hàm có bao nhiêu số gọi, có những thuộc tính liên quan gì đến nó.
Về khuyết điểm này, có thể so sánh trong ví dụ 2 và 4
QnJhZPfELYbqObl (Gast)
01/14/2012 4:06am (UTC)[quote]
IJWTS wow! Why can't I think of thnigs like that?
logan1987 (Gast)
03/16/2012 4:37am (UTC)[quote]
Detective story 1930s though became sassy not, satyric crabbed cars. http://tavkuf.com

Answer:

Nickname:

 Text color:

 Font size:
Close tags



Total topics: 11
Total posts: 37
Total users: 24
Online now (registered users): Nobody crying smiley
 
Đánh giá  
 

Bạn thấy các phần mềm của mình như thế nào?
Rất hay và có ích
Bình thường thôi
Quá tệ

(View results)


 
Số người truy cập trong tháng này 114675 visitors (260658 hits)
This website was created for free with Own-Free-Website.com. Would you also like to have your own website?
Sign up for free