• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB

Các bài viết hướng dẫn, giúp các bạn hiểu và tiếp cận với Visual Basic nhanh hơn
Hình đại diện của người dùng
Sparrow
Thành viên tích cực
Thành viên tích cực
Bài viết: 135
Ngày tham gia: T.Năm 27/03/2008 12:45 am
Đến từ: Lê Quý Đôn Đà Nẵng T_T
Liên hệ:

Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB

Gửi bàigửi bởi Sparrow » CN 30/03/2008 11:42 am

Tên bài viết: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB
Tác giả: thanh3em
Cấp độ bài viết: Từ căn bản đến nâng cao
Tóm tắt: Học , hiểu và làm ActiveX DLL ... một việc không thể thiếu khi lập trình


Chắc các bạn mới học nghề chưa hiểu rõ hết tác dụng của thằng thư viện liên kết động nhỉ, tại sao phải tạo nó và tạo nó như thế nào, có khó không ?
Câu trả lời là không khó, rất dễ, bạn nào biết cách tạo và sử dụng hàm và thủ tục thì tạo thư viện liên kết động chỉ dựa vào chừng nấy thui

KỲ 1: Trước hết, bạn phải rõ thư viện động là cái chi chi và nó hoạt động như thế nào
Bản thân tên gọi “thư viện liên kết động” làm cho ta liên tưởng đến các thư viện cho phép các ứng dụng có thể liên kết đến và sử dụng nó. Thư viện liên kết động là modul chứa các hàm và dữ liệu mà có thể được sử dụng bởi nhiều ứng dụng khác nhau ở cùng một thời điểm. Ví dụ: thư viện user32.dll hoặc kernel32.dll là các thư viện liên kết động mà mỗi ứng dụng Windows đều phải dùng đến. Khi đã được viết và đóng gói trong một DLL, một hàm có thể được sử dụng ở bất cứ ứng dụng nào dưới dạng mã máy của nó mà không phải quan tâm đến mã nguồn nó được viết chi tiết ra sao
(Theo Wikipedia - tại tui không biết nói cho với các bạn rõ nên đành phải nhờ thằng Wikipedia giúp 1 tay zậy :-D )

Các bạn thấy rõ đấy, các hàm API từ trước đến giờ bạn sử dụng và gọi chẳng là chỉ là 1 hàm nằm trong 1 thư viện liên kết động. Thư viện liên kết động có thể được tạo bới bất cứ ngôn ngữ lập trình gì nhưng cách gọi và sử dụng nó thì rất đơn giản, kô hề phụ thuộc vào bất cứ ngôn ngữ nào. Vì thế bạn có thể tự tạo ra bộ thư viện liên kết động cho riêng mình và hoặc là Add thằng vào chương trình luôn (chỉ có thư viện do VB mới Add được thui) hoặc gọi giống như 1 hàm API (do nó được viết bởi các ngôn ngữ khác như C nên kô add được)

Sau đây ta sẽ tìm hiểu chi tiết về ưu nhược điểm của việc sử dụng thư viện liên kết động. Các thư viện liên kết động là một thành phần không thể thiếu tạo nên hệ điều hành Windows. Ở đó, việc quản lý, trao đổi với phần cứng hay thiết bị ngoại vi đều thông qua các hàm có sẵn trong windows mà ta hay gọi là Windows API. Thay vì ta phải đữa lệnh điều khiển cho màn hình vẽ lên một cửa sổ giao diện như các ứng dụng, thì ta chỉ cần gọi một hàm trong một file DLL nào đó, hệ thống sẽ đảm bảo kết quả như ý muốn. Sau đây là ưu nhược điểm của thư viện liên kết động DLL

Ưu nhược điểm của thư viện liên kết động
- Giảm không gian sử dụng của bộ nhớ: hàm và dữ liệu trong các DLL được chia sẻ bởi các ứng dụng dùng nó. Như trong ví dụ ở trên, các ứng dụng Winword, Excel, Internet Explorer sẽ dùng chung một hàm print() đã được biên dịch thành mã máy và để trong một DLL nào đó, mà không cần phải include toàn bộ mã nguồn của hàm. Bên cạnh đó,ta cũng có thể giảm được dung lượng bộ nhớ của chương trình tùy vào cách dùng các hàm DLL (Run-time hay Load-time, sẽ được trình bày sau): ứng dụng của ta sẽ chỉ nạp các hàm này khi nào dùng đến.
Mã trong DLL nằm trong khu vực chỉ cho đọc (read-only) và được nạp vào các trang nhớ đánh dấu read-only. Nó cho phép hệ thống ánh xạ DLL vào trong không gian địa chỉ nhớ của các tiến trình sử dụng nó. Và như vậy, DLL được nạp chỉ một lần, và nếu một tiến trình yêu cầu sử dụng nó, hệ điều hành chỉ việc ánh xạ DLL tới không gian địa chỉ của ứng dụng gọi DLL.

- Giảm Swapping (tráo đổi): ta tưởng tượng có hai tiến trình sử dụng cùng một DLL, một tiến trình kết thúc công việc của nó và thoát ra. Nhưng DLL sẽ không gỡ bỏ ra khỏi bộ nhớ vì DLL quản lý thời gian tồn tại của nó bằng cách giữ một bộ đếm tham khảo cho các tiến trình sử dụng nó. Mỗi khi có một tiến trình nào đó yêu cầu sử dùng DLL, bộ đếm tham khảo sẽ tăng giá trị của nó lên 1; còn khi có một tiến trình gỡ bỏ không sử dung nữa thì bộ đếm lại giảm đi 1. DLL sẽ tự động xóa bỏ ra khỏi bộ nhớ chừng nào bộ đếm tham khảo trở về 0, trạng thái cho biết không còn có tiến trình nào sử dụng DLL nữa.
Bây giờ giả sử có một tiến trình bắt đầu chạy và yêu cầu hệ thống nạp một DLL hiện đang được dùng bởi một ứng dụng đã chạy trước đó. Chuyện gì sẽ xảy ra? Liệu hệ thống có nạp DLL một lần nữa không? Hiển nhiên là không, vì DLL được định nghĩa ra để có thể dùng chung giữa các ứng dụng khác nhau. Thành phần đã nạp DLL có tất cả các hàm và dữ liệu của nó trong bộ nhớ và hệ thống sẽ chỉ phải ánh xạ chúng tới không gian địa chỉ của tiến trình mới cho chúng hoạt động. Nó liên quan đến việc đọc các hàm và dữ liệu DLL từ trên đĩa.

- Khi đã xây dựng được một DLL với các chức năng hợp lý, ta có thể sử dụng nó trong bất cứ ứng dụng nào mà ta cảm thấy thích hợp. Ví dụ trong một ứng dụng nhỏ, ta có tập hợp các hàm chuyển đổi giá trị từ String sang ngày tháng và đóng gói nó vào trong một DLL. Khi đó, ở một ứng dụng khác, khi có nhu cầu chuyển đổi như trên, thì ta sẽ không phải viết lại các hàm hoặc đính kèm mã nguồn của các hàm đó vào chương trình đó nữa mà sử dụng trực tiếp DLL mà ta đã biên dịch.
Tạo ra khả năng tương tác giữa các ngôn ngữ: Một ứng dụng có thể sử dụng các DLL viết bằng bất cứ ngôn ngữ nào. Các nhà phát triển phần mềm chỉ việc đóng gói các module của mình vào trong một DLL với ngôn ngữ ưa thích, sau đó module này có thể được sử dụng trong các ứng dụng viết bằng C++ hay Visual Basic.
Mặc dù hầu hết các ngôn ngữ đều hỗ trợ việc sử dụng thư viện liên kết động, nhưng lại có rất ít ngôn ngữ cho phép tạo ra chúng. Với việc sử dụng DLL, người ta có thể tập trung nhiều hơn vào các xử lý logic của hệ thống, mà không cần phải quan tâm đến những xử lý thông thường, mà nếu phát triển từ đầu, sẽ chi phí rất nhiều thời gian và công sức. Các công việc này đã được thực hiện bởi một người nào đó, và đóng gói dưới dạng các DLL.

- Dễ dàng đưa ra sự hỗ trợ sau khi đã chuyển giao ứng dụng cho khách hàng: nếu như ta phát hiện có một số thành phần trong ứng dụng cần phải được thay đổi và sự thay đổi này cần phải được cập nhật cho khách hàng. Đóng gói và phân phối lại toàn bộ sản phẩm đã bán cho tất cả các khách hàng của chúng ta là một công việc hết sức khó khăn. Tuy nhiên ta có thể tránh được điều này nếu như ứng dụng của ta được thiết kế tốt thành các module và đóng gói chúng trong các DLL. Khi một module nào đó cần thay đổi, ta chỉ việc đóng gói lại DLL chứa module đó và gửi tới khách hàng, cho họ cập nhật.
- DLL Hell: là khó khăn lớn nhất thỉnh thoảng gặp khi dùng DLL. Ta có thể gặp những thông báo lỗi dạng như: “The ordinal abc could not be located in the dynamic-link library xyz.dll.”; hoặc khi cài đặt một ứng dụng mới, một số chương trình khác đang bình thường bỗng nhiên bị trục trặc hoặc thậm chí không thể nạp lên để chạy được. Đó là các dấu hiệu của DLL Hell trên máy tính của ta. Nguyên nhân cơ bản của sự cố trên là do chương trình cài đặt không kiểm tra phiên bản của các DLL trước khi sao lưu nó vào trong thư mục hệ thống. Khi một DLL mới thay thế một DLL cũ có sẵn, và nếu DLL mới này có một số thay đổi lớn làm cho nó không thể tương thích ngược lại với các chương trình sử dụng phiên bản cũ, nó sẽ làm rối loạn chương trình đó.

(Bây giờ các bạn đã hiểu thế nào thư viện liên kết động chưa, công việc tiếp theo của ta là tạo 1 thư viện liên kết động, hẹn cac bạn ở kỳ 2 nhé)
------------------------------------------------------------------------
Bài học này của tác giả thanh3em ... Link : http://quantoancity.com/caulacbovb/foru ... 390#p17578


Noob is me ... hi hi :D :D

Hình đại diện của người dùng
Sparrow
Thành viên tích cực
Thành viên tích cực
Bài viết: 135
Ngày tham gia: T.Năm 27/03/2008 12:45 am
Đến từ: Lê Quý Đôn Đà Nẵng T_T
Liên hệ:

Re: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB

Gửi bàigửi bởi Sparrow » CN 30/03/2008 11:46 am

Tên bài viết: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB
Tác giả: thanh3em
Cấp độ bài viết: Từ căn bản đến nâng cao
Tóm tắt: Học , hiểu và làm ActiveX DLL ... một việc không thể thiếu khi lập trình


Tiếp theo kỳ 1, ở kỳ 2 này, ta sẽ tạo 1 thư viện liên kết động đơn giản nhất (nhớ đọc kỹ kỳ 1 để biết cách thức hoạt động của nó nhé!)

Đầu tiên, bạn vô VB6 tạo dự án mới, khi hộp thoại này hiện lên thì chọn mục ActiveX DLL (xem hình vẽ)
(hoặc vô Files --> New Project (Ctrl + N), chọn ActiveX DLL)
Hình ảnh
Hình ảnh
Tiếp theo, bạn phải có kha khá 1 kho source các đoạn mã nguồn hay, phân loại nó vào từng Class (để dễ quản lý) và gọi sử dụng.
* Cách tạo Class và các thuộc tính của nó
- Để tạo 1 Class, bạn chọn Project --> Add Class Module
- Chọn thuộc tính phạm vi hoạt động cho nó (Instancing) (Xem hình):

Hình ảnh
Hình ảnh
+ Private: Các Class, Module khác sẽ không gọi được Class này, các hàm trong Class mang tính chất cục bộ
+ PublicNotCreatable: Các Class, Module khác trong project sẽ gọi và sử dụng được Class này, nhưng khi biên dịch thành file DLL, thì chương trình khác không gọi được nó.
+ MultiUse: Thuộc tính này sẽ giúp Class có thể được gọi và sử dụng trong project và ngay cả với các chương trình khác sau khi biên dịch thành file DLL
(Hai thuộc tính trên đều phải khai báo Class chứa hàm cần gọi)
VD: Dim abc As NewClass
abc.[hàm or lệnh]
+ GlobalMultiUse: phạm vi cao nhất, các hàm Class sẽ được sử dụng toàn cục, không cần phải khai báo sử dụng Class chứa nó
(Thuộc tính này có lợi khi khai báo sử dụng API)
VD: Declare Function [Tên hàm] Lib "[Tên thư viện DLL]" ([Các tham số: Byval a as Long, Byref b as String]) As Long
- Ngoài ra còn có các thuộc tính khác của Class nhưng bài viết mục đích là tạo 1 thư viện liên kết động đơn giản nên ta không cần bàn đến nó !

Sau khi xác định và tạo được các Class, ta phải phân loại các mã nguồn, hàm ta có được vào Class này
VD: các hàm sử lý chuỗi như tách, đọc số, chuyển chuỗi ngày tháng sang thứ trong tuần, ... thì cho vào Class String (Đây chỉ là ví dụ, các bạn có thể đổi tên Class cho phù hợp với mình)
Các bạn có thể tham khảo 1 bộ thư viện liên kết động mà mình đã tạo: http://www.caulacbovb.com/forum/viewtopic.php?t=3129

* Cấu trúc 1 hàm trong Class tối thiểu phải có như sau:

Mã: Chọn hết

  1.  
  2. ' Public or Private
  3. Public Function [Tên Hàm] (Byval a As Long, Byref b As String, [Tên biến] as [Kiểu dữ liệu]) as Long
  4. On Error Goto Loi: ' Bẫy lỗi xảy ra (có thể bỏ qua nếu là hàm ngắn gọn, chắc chắn không có lỗi)
  5. '
  6. ' Các lệnh xử lý hàm
  7. '
  8. [Tên Hàm] = 1 ' Hàm trả về 1 khi thành công hay trả về giá trị của hàm
  9. Exit Function ' Thoát khỏi hàm
  10. Loi:
  11. [Tên Hàm] = 0 ' Trả về 0 khi xảy ra lỗi
  12. End Function
  13.  


* Chú ý khi xây dựng 1 hàm:
- Thứ nhất: Từ khóa Public (toàn cục) / Private (cục bộ): tùy theo mục đích của hàm, là hàm chính hay hàm phụ mà ta đặt khóa này cho phù hợp.
- Thứ hai: Từ khóa Byval / Byref: chú ý và phân biệt chức năng của nó cho kỹ nha.
+ Byval: là từ viết tắt của By Value, nghĩa là truyền bằng trị. Phương pháp này không làm thay đổi giá trị của nội dung của biến khai báo bởi từ khóa Byval
+ Byref: là từ viết tắt của By Reference, nghĩa là truyền bằng tham khảo. Phương pháp này cho phép thay đổi nội dung của biến được khai báo bởi từ khóa Byref. Mục đích là nếu ta muốn trả về nhiều giá trị chứ không phải 1 thì ta dùng cách này. Nếu chỉ trả về 1 giá trị thì ta trả về giá trị của hàm thôi. Các bạn cứ xem ví dụ dưới đây sẽ hiểu rõ ah:

VD phân biệt 2 từ khóa Byval và Byref

Mã: Chọn hết

  1.  
  2. Public Function GetDateFromString(ByVal sDate As String, ByRef iDay As Integer, ByRef iMonth As Integer, ByRef iYear As Integer) As Long
  3. On Error GoTo Loi
  4. Dim aDate As Date
  5. aDate = Format(sDate, "dd/mm/yyyy")
  6. iDay = Day(aDate) ' Trả về ngày cho biến iDay
  7. iMonth = Month(aDate) ' Trả về tháng cho biến iMonth
  8. iYear = Year(aDate) ' Trả về năm cho biến iYear
  9. GetDateFromString = 1
  10. Exit Function
  11. Loi:
  12. GetDateFromString = 0
  13. End Function
  14.  


Khi đó, muốn sử dụng hàm GetDateFromString thì ta làm như sau

Mã: Chọn hết

  1.  
  2. Dim a As Integer, b As Integer, c As Integer ' Khai báo các biến trả về cho iDate, iMonth, iYear
  3. If GetDateFromString("29/06/2006", a, b, c) = 1 Then ' Nếu không xảy ra lỗi
  4. MsgBox a & "," & b & "," & c ' Khi này các biến a,b,c đã được hàm trả về giá trị của nó
  5. End If
  6.  

- Thứ ba: [Kiểu dữ liệu]: nếu là kiểu dữ liệu chuẩn của VB thì không nói gì, điều chú ý nếu là kiểu dữ liệu tự định nghĩa bằng các từ khóa Enum và Type thì phải chú ý đến sự đồng bộ giữa phạm vi hoạt động của Class chứa hàm và phạm vi của kiểu dữ liệu đó.
Ví dụ: Nếu Class bạn đặt là MultiUse thì khi khai báo kiểu dữ liệu Enum thì phải đặt từ khóa Public và đặt nó ngay trong Class đó, chứ không thui nó báo lỗi liền (Xem hình)
Hình ảnh
Hình ảnh
- Thứ tư: Nếu trong hàm sử dụng Hook, hay Subclass thì đặt các hàm, thủ tục SubClass trong 1 Module, không đặt trong một Class

Thế là xong, trên đây chỉ là các bước đơn giản để tạo 1 hàm sử dụng trong thư viện liên kết động (Bài viết này do em tự viết, có đôi chỗ dùng sai thuật ngữ tại em cũng học VB không hoàn chỉnh, làm tới đâu, học tới đó, nên có gì thiếu sót, mong các pác nhắc nhở)
Các bạn có thể tham khảo 1 bộ thư viện liên kết động mà mình đã tạo: http://www.caulacbovb.com/forum/viewtopic.php?t=3129

Kỳ tiếp theo: Kỳ 3, sẽ hướng dẫn các bạn sử dụng các thư viện liên kết động, cách đăng ký, cách gọi các hàm đã viết, sao cho hiểu quả ...!
------------------------------------------------------------------------
Bài học này của tác giả thanh3em ... Link : http://quantoancity.com/caulacbovb/foru ... 390#p17578
Noob is me ... hi hi :D :D

Hình đại diện của người dùng
Sparrow
Thành viên tích cực
Thành viên tích cực
Bài viết: 135
Ngày tham gia: T.Năm 27/03/2008 12:45 am
Đến từ: Lê Quý Đôn Đà Nẵng T_T
Liên hệ:

Re: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB

Gửi bàigửi bởi Sparrow » CN 30/03/2008 11:51 am

Tên bài viết: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB
Tác giả: thanh3em
Cấp độ bài viết: Từ căn bản đến nâng cao
Tóm tắt: Học , hiểu và làm ActiveX DLL ... một việc không thể thiếu khi lập trình


Kỳ thứ 3-I
Cấu trúc chung của 1 Class gồm các thành phần sau (chỉ mang tính tương đối, có thể không có):
* Từ khóa Public và Private rất quan trọng, nếu đặt từ khóa Public cho các biến, kiểu dữ liệu tự định nghĩa, hàm, thủ tục thì người ngoài có thể gọi và sử dụng nó, không thì nó sẽ ẩn đi

1. Phần khai báo biến, Hằng, các hàm API, các kiểu dữ liệu tự định nghĩa
VD:

Mã: Chọn hết

  1.  
  2. Const ABC = "ABC"
  3.  
  4. Public Type P
  5. P1:Long
  6. P2:String
  7. End Type
  8.  
  9. 'Chú ý, nếu tên có dấu cách thì phải đặt trong cặp dấu ngoặc vuông []
  10. Public Enum E
  11. E1 = 1
  12. [E 2] = 2
  13. End Enum
  14.  
  15. Private Declare Function API_A Lib "shell32.dll" (ByVal dwA As Long, lpData As P) As Long
  16.  
  17. Private A As String
  18. ' Giả sử bạn có đặt các thuộc tính cho Class thì nên khai báo các biến này
  19. Private m_TT1 As String
  20. Private m_TT2 As Font
  21. Private m_TT3 As Long
  22. ' --
  23. 'Chú ý: nếu đặt khóa Public thì biến đó có thể coi như sử dụng như một thuộc tính của Class
  24. Public B As Long
  25.  

* Chú ý quan trọng: Trong phần 1, mình chỉ chú ý các bạn đến sự đồng bộ giữa từ khóa Private/Public trong phần khai báo và từ khóa Private/Public trong các hàm.
Giả dụ: Nếu bạn đặt từ khóa Public cho 1 hàm, bắt buộc các khai báo có liên quan phải Set Public

Mã: Chọn hết

  1.  
  2. Public Function Ham1(Byval So1 As E) As P
  3. ' ...
  4. ' Trong ví dụ này, khi khai báo, bắt buộc phải đặt từ khóa khai báo cho E và P là Public (mình đã đặt sẵn ở trên cho phù hợp với ví dụ này)
  5. End Function
  6.  


2. Phần khai báo các sự kiện thêm, riêng cho Class (giống như sự kiện trong ActiveX OCX - Usecontrol)

Event [Tên sự kiện](ThamSo1 As Integer, [Tham số 2] As [Kiểu dữ liệu])
Ví dụ (Lấy trong Class TraySystem của thư viện VietDLL cho rõ):

Mã: Chọn hết

  1.  
  2. Event BalloonClicked() ' Sự kiện xảy ra khi người dùng click lên Balloon
  3. Event MouseUp(Button As Integer) ' Sự kiện xảy ra khi người dùng nhả chuột khi nhấn vào icon trên SystemTray, tham số truyền vào ở đây là Button cho biết chuột trái hay phải nhấn
  4.  

Và cách gọi sự kiện cùng ý nghĩa các tham số của nó ta sẽ tham khảo sau, trong kỳ 3-II

3.Đặt thuộc tính cho Class
Giả dụ: ta có 1 số lệnh sau

Mã: Chọn hết

  1.  
  2. Dim A As New Class1 ' Class1 là tên Class mình đang làm
  3. A.TT1 = Me.Caption ' Đây là lệnh sẽ đặt nội dung cho thuộc tính TT1 là chuỗi tiêu đề Form hiện hành
  4. Set A.TT2 = Me.Font 'Đây là lệnh sẽ đặt nội dung cho thuộc tính TT2 là kiểu Font của Form hiện hành
  5. Msgbox A.TT1 ' Đây là lệnh sẽ lấy nội dung thuộc tính TT1 của Class1 và thông báo
  6. Msgbox A.Font.Name ' Đây là lệnh sẽ lấy nội dung thuộc tính TT2 của Class1 và thông báo
  7. Msgbox A.TT3(1) ' Đây là lệnh sẽ lấy nội dung thuộc tính TT2 có chỉ số 1 của Class1 và thông báo
  8.  

Có lẽ em giải thích hơi ấu trĩ nhỉ :-D

Ở đây, em chỉ biết có 2 cách đặt là Let, Set, lấy thuộc tính là Get (còn những cái nào, hiện em chưa biết, lỡ có gì thiếu mong các pác chỉ giáo)
Đưới đây là các mẫu cấu trúc cho 3 từ khóa trên

Mã: Chọn hết

  1.  
  2. Public Property Get TT1() As String
  3. ' Nếu bạn chỉ để từ khóa Get, không để từ khóa Set hoặc Let thì người dùng chỉ có thể lấy nội dung của thuộc tính nhưng không được phép cập nhập, theo mình thì từ khóa Get phải có mặt
  4. TT1 = m_TT1 ' Gán nội dung TT1 từ nội dung của biến m_TT1 đã khai báo trên
  5. ' các lệnh xử lý khác nếu có
  6. End Property
  7.  
  8. Public Property Get TT2() As Font
  9. Set TT2 = m_TT2
  10. End Property
  11.  
  12. ' Sử dụng tùy theo 2 thuộc tính Set và Let; chỉ dùng 1 trong 2 thui
  13. Public Property Let TT1(V As String)
  14. ' ...
  15. m_TT1 = V ' Đặt nội dung của V cho biến m_TT1
  16. ' Các lệnh xử lý khác nếu có, như
  17. If V="" then Msgbox "Loi"
  18. End Property
  19.  
  20. Public Property Set TT2(V As Font)
  21. ' ...
  22. ' Nếu người dùng đặt thuộc tính bằng từ khóa Set như ví dụ trên, bắt buộc phải dùng từ khóa Set
  23. Set m_TT2 = V
  24. ' Các lệnh xử lý khác nếu có
  25. End Property
  26.  
  27. Public Property Get TT3(Ind As Long) As Long
  28. TT3 = m_TT3(Ind)
  29. End Property
  30. Public Property Let TT2(Ind As Long, V As Long)
  31. ' Chú ý ngoài biến V để gán dữ liệu, nếu ở trên trong thủ tục lấy có biến nào, thì thủ tục gán cũng có biến đó, ở đây ví dụ là biến Ind
  32. End Property
  33.  


* Chú ý:
- Nếu chỉ đơn giản là tạo thuộc tính để lưu trữ nội dung, không cần xử lý bằng các câu lệnh gì thêm thì ta có thể khai báo trực tiếp biến
VD: Ta sẽ khao báo trực tiếp biến TT1, TT2, TT3 thay cho các dòng Get Và Let trong mục 1

Mã: Chọn hết

  1.  
  2. Public TT1 As String ' nếu khai báo vậy thì ngầm hiểu rằng sử dụng Get và Let
  3. Public TT2 As Font ' nếu khai báo vậy thì ngầm hiểu là sử dụng Get và Set
  4. Public TT3(3) As Long
  5.  

- Phải chú ý đồng bộ dữ liệu giữa 2 việc Get và Let (hoặc Set), Nếu Get mà trả về kiểu String, Let lại gán kiểu giá trị Long thì sẽ báo lỗi ngay

Bài viết trên là do em viết, có thể còn rất nhiều lỗi do hiểu chưa tốt, mong các pác đọc và nhắc nhở để em củng cố lại, sửa lại cho hoàn chỉnh ! Thank

Trên đây, chúng ta đã đi được nửa dặm đường rùi đấy !
Kỳ này tạm thời dùng ở đây, dài quá mọi người theo dõi hổng được, hẹn ở kỳ tiếp nhé (không biết rảnh để viết không nữa :-D)
------------------------------------------------------------------------
Bài học này của tác giả thanh3em ... Link : http://quantoancity.com/caulacbovb/foru ... 390#p17578
Noob is me ... hi hi :D :D

Hình đại diện của người dùng
Sparrow
Thành viên tích cực
Thành viên tích cực
Bài viết: 135
Ngày tham gia: T.Năm 27/03/2008 12:45 am
Đến từ: Lê Quý Đôn Đà Nẵng T_T
Liên hệ:

Re: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB

Gửi bàigửi bởi Sparrow » CN 30/03/2008 12:05 pm

Tên bài viết: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB
Tác giả: thanh3em
Cấp độ bài viết: Từ căn bản đến nâng cao
Tóm tắt: Học , hiểu và làm ActiveX DLL ... một việc không thể thiếu khi lập trình


Kỳ tiếp theo ...
Kỳ thứ 3-II
Ở kỳ 3-I, ta đã tham khảo một số cấu trúc mẫu của 1 Class trong 1 thư viện liên kết động
Trong kỳ 3-II này, mình sẽ hướng dẫn các phần còn lại!


4. Phần thuộc tính bắt buộc và chung của 1 Class

Các Class đều có 2 sự kiện chung là Initialize và Terminate
+ Initialize: xảy ra khi bắt đầu thao tác với Class như chạy 1 hàm, lệnh trong Class, đặt các thuộc tính của Class như đã nêu trên, ...
Gợi ý: có thể dựa vào nó để thiết đặt các giá trị ban đầu cho toàn bộ Class, hoặc là nếu chương trình của bạn mang tính thương mại thì có thể kiểm tra đã đăng ký chưa :-D
+ Terminate: xảy ra khi ứng dụng, Form liên kết với Class bị Kill (Unload) hoặc ta xóa Class khỏi bộ nhớ (Set [Tên Class] = Nothing). Nhưng chỉ khi sự kiện Initialize xảy ra rồi thì sự kiện Terminate mới có

Hai sự kiện này ta coi như nó giống như Load và Unload của Form đóa :-D


Tôi lấy Ví dụ trong Class TraySystem để các bạn hiểu rõ hơn

Mã: Chọn hết

  1.  
  2. Private Sub Class_Initialize()
  3. m_AutoTiengViet = True ' Mặc định là tự động gõ tiếng việt
  4. CheckRegister ' Kiểm tra đăng ký sử dụng
  5. End Sub
  6.  
  7. '...
  8.  
  9. Private Sub Class_Terminate()
  10. ' If the icon is still in the tray, remove it
  11. If m_IconLoaded = True Then RemoveIcon ' Remove Icon trên SystemTray khi Unload Form --> tức là Unload Class
  12. End Sub
  13.  



5. Cách sử dụng các thuộc tính, các sự kiện đã khai báo ở trên

Ở mục 2, ta đã tham khảo cách khai báo các sự kiện thêm cho Class. Đó mới chỉ là cái vỏ bọc chứ chưa có cái hồn hay thực ra nó chưa hoạt động như là 1 sự kiện thật sự. Giờ ta sẽ quy định cho nó khi nào thì sẽ xảy ra sự kiện đã khai báo trên. Trước tiên ta phải xác định rõ ràng khi nào thì sự kiện xảy ra và các tham số phù hợp kèm theo của nó.
Sau đó dùng lệnh RaiseEvent [Tên sự kiện]([Gán các giá trị cho biến của sự kiện]) để bắt và kích hoạt sự kiện, khi nào các hàm nằm trong sự kiện đó sẽ chạy (giống như sự kiện của Control bất kỳ nào)


Và một ví dụ như sau, cũng trong SystemTray, với các sự kiện DoubleClick, MouseDown, MouseUp giả dụ đã khai báo ở trên

Mã: Chọn hết

  1.  
  2. ' ***************************------------------------Khai bai cac su kien--------------------------------*******************************
  3. Event MouseUp(Button As Integer) ' Button la bien cho ta biet Mouse nhan la trai hay phai
  4. Event MouseDown(Button As Integer) ' Button la bien cho ta biet Mouse nhan la trai hay phai
  5. Event DoubleClick(Button As Integer) ' Button la bien cho ta biet Mouse nhan la trai hay phai
  6. ' ***************************------------------------ket thuc khai bai cac su kien----------------------*******************************
  7.  
  8. Private Sub m_Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  9. Dim Msg As Long
  10. If m_Form.ScaleMode = 1 Then
  11. Msg = X / Screen.TwipsPerPixelX
  12. Else
  13. Msg = X
  14. End If
  15.  
  16. Select Case Msg
  17. ' Bắt sự kiện DoubleClick với chuột trái là 0, phải là 1 và truyền vào biến Button
  18. Case WM_LBUTTONDBLCLK: RaiseEvent DoubleClick(0)
  19. Case WM_RBUTTONDBLCLK: RaiseEvent DoubleClick(1)
  20.  
  21. ' Bắt sự kiện MouseDown với chuột trái là 0, phải là 1 và truyền vào biến Button
  22. Case WM_LBUTTONDOWN: RaiseEvent MouseDown(0)
  23. Case WM_RBUTTONDOWN: RaiseEvent MouseDown(1)
  24.  
  25. ' Bắt sự kiện MouseUp với chuột trái là 0, phải là 1 và truyền vào biến Button
  26. Case WM_LBUTTONUP: RaiseEvent MouseUp(0)
  27. Case WM_RBUTTONUP: RaiseEvent MouseUp(1)
  28. End Select
  29.  
  30. End Sub
  31.  



Vậy là trong kỳ 3, ta đã tham khảo toàn bộ các cấu trúc và đặc tính của 1 Class, cũng như cách xây dựng hàm, thuộc tính, sự kiện của Class. Còn lại là công việc của bạn nữa thui, ai không hiểu phần nào, cứ Post, em sẽ giải đáp giùm cho, thấy khó khắn chỗ nào, nếu giúp được, em sẽ làm.
Các pác có thể down Source bên dưới minh họa việc tạo Class, Class SystemTray giúp đưa chương trình xuống khay hệ thống với Balloon TooltipText.
Và ở kỳ tiếp theo là sẽ hướng dẫn sử dụng thư viện theo 2 cách, và mỗi cách có 1 ưu nhược điểm riêng của nó !
File đính kèm : http://quantoancity.com/caulacbovb/forum/download/file.php?id=1591&sid=d91415ad138a600ad66fac9e7829d390
------------------------------------------------------------------------
Bài học này của tác giả thanh3em ... Link : http://quantoancity.com/caulacbovb/foru ... 390#p17578
Noob is me ... hi hi :D :D

Hình đại diện của người dùng
Sparrow
Thành viên tích cực
Thành viên tích cực
Bài viết: 135
Ngày tham gia: T.Năm 27/03/2008 12:45 am
Đến từ: Lê Quý Đôn Đà Nẵng T_T
Liên hệ:

Re: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB

Gửi bàigửi bởi Sparrow » CN 30/03/2008 12:12 pm

Tên bài viết: Phân biệt giữa API DLL và ActiveX DLL
Tác giả: THE LAST LEAF
Cấp độ bài viết:
Tóm tắt: Phân biệt giữa 2 loại DLL là API DLL và ActiveX DLL


Hình như một số bạn vẫn nhầm lẫn và chưa rõ ràng sự khác biệt giữa API Dll và ActiveX Dll (ActiveX chứ ko phải là Active :-D), ngay cả thanh3em cũng vậy. Một điều khẳng định là cho đến thời điểm bây giờ thì VB vẫn không có khả năng tạo API Dll mà chỉ có thể tạo được ActiveX Dll (không phải chuyển thành COM gì đó thì ActiveX Dll sẽ thành API dll được đâu nhé :-D), muốn tạo được API Dll bạn cần sử dụng các ngôn ngữ khác như VC++, Delphi, ASM,...

Về mặt cấu trúc thì 2 loại dll giống nhau chỉ có khác biệt

- API Dll xuất trực tiếp các hàm của nó qua các entry point đc sắp xếp trong export table, các chương trình sử dụng nạp dll và tham trỏ đến các entry này trong quá trình gọi hàm, các thư viện API dll quen thuôc của Windows đó là user32.dll, kernel32.dll, gdi32.dll, advapi32.dll,....
- ActiveX Dll chỉ xuất 2 hàm API chính (nghĩa là có thể sử dụng như API Dl) đó là DllRegisterServer và DllUnregisterServer, 2 hàm này có nhiệm vụ đăng ký và hủy đăng ký đối tượng (object) trong ActiveX Dll với Windows. Ngoài ra còn có thể có thêm DllCanUnloadNow và DllGetClassObject.(các chương trình đăng ký kiểu như regsvr32 chẳng qua chỉ là chương trình gọi các hàm kia, thế nên có thể dễ dàng tạo đc chương trình giống như regsvr32 :-D) Như vậy khi sử dụng thay vì sử dụng các hàm như API Dll, user sẽ tham trỏ đến object và sử dụng các sub, func, event mà object cung cấp, điều này rất có lợi trong lập trình OOP.Nhược điểm của loại dll này khi sử dụng đó là như các bạn đã biết đó là phải reference đến nó
-Ngoài ra còn có loại dll là kết hợp của cả 2 loại trên, ví dụ tiêu biểu là shell32.dll

Hy vọng qua bài này các bạn có sự phân biệt rõ hơn 1 chút 2 loại thư viện liên kết động là nền tảng của windows và các ứng dụng trên windows
----------------------------------------------------
Nội dung bài viết này của tác giả THE LAST LEAF ... Link : http://quantoancity.com/caulacbovb/foru ... 0&start=20
Noob is me ... hi hi :D :D

Hình đại diện của người dùng
Sparrow
Thành viên tích cực
Thành viên tích cực
Bài viết: 135
Ngày tham gia: T.Năm 27/03/2008 12:45 am
Đến từ: Lê Quý Đôn Đà Nẵng T_T
Liên hệ:

Re: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB

Gửi bàigửi bởi Sparrow » CN 30/03/2008 12:19 pm

Tên bài viết: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB
Tác giả: thanh3em
Cấp độ bài viết: Từ căn bản đến nâng cao
Tóm tắt: Học , hiểu và làm ActiveX DLL ... một việc không thể thiếu khi lập trình


Kỳ 4: Hướng dẫn tạo DLL qua ví dụ nhỏ.

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:

Mã: Chọn hết

  1.  
  2. Option Explicit
  3. ' ----------------------- Khai bao hang ---------------------------
  4. ' Hang su dung cho ham chup cua so man hinh
  5. Public Const VK_SNAPSHOT As Byte = &H2C
  6.  
  7. ' Hang su dung cho ham FormOnTop
  8. Public Const SWP_NOSIZE = &H1
  9. Public Const SWP_NOMOVE = &H2
  10. Public Const SWP_NOACTIVATE = &H10
  11. Public Const SWP_SHOWWINDOW = &H40
  12. Public Const HWND_TOPMOST = -1
  13. Public Const HWND_NOTOPMOST = -2
  14. ' ----------------------- Ket thuc khai bao -----------------------
  15.  
  16. ' ----------------------- Khai bao API ----------------------------
  17. ' Ham API su dung cho ham chup cua so man hinh
  18. Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal
  19.  
  20. dwExtraInfo As Long)
  21.  
  22. ' Ham API su dung cho ham Dat Form tren cung
  23. Public Declare Function SetWindowPos& Lib "user32" (ByVal Hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long,
  24.  
  25. ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
  26. Public Declare Function SetForegroundWindow Lib "user32" (ByVal Hwnd As Long) As Long
  27. ' ---------------------- Ket thuc khai bao ------------------------
  28.  


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 :-D)

Mã: Chọn hết

  1.  
  2. Option Explicit
  3.  
  4. Public Function CaptureScreen() As StdPicture
  5. On Error GoTo loi
  6. Call keybd_event(VK_SNAPSHOT, 0, 0, 0)
  7. DoEvents
  8. Set CaptureScreen = Clipboard.GetData(vbCFBitmap)
  9. loi:
  10. End Function
  11.  
  12. Public Function FormOnTop(ByVal Hwnd As Long, Optional ByVal bTopMost As Boolean = True) As Long
  13. ' Chu y: Ban co thay minh dat khoa Optional truoc tu Byval khong
  14. ' Tac dung cua tu khoa nay: Minh muon mac dinh cho bien bTopMost la True, neu
  15. ' nguoi dung khong truyen gia tri cho no
  16. ' Co the nguoi ta goi: Call FormOnTop (Me.Hwnd) = Call FormOnTop(Me.Hwnd, True)
  17.  
  18. On Error GoTo loi
  19. Dim f As Long, p As Long
  20. f = SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE Or SWP_SHOWWINDOW
  21. Select Case bTopMost
  22. Case True
  23. p = HWND_TOPMOST
  24. Case False
  25. p = HWND_NOTOPMOST
  26. End Select
  27. SetWindowPos Hwnd, p, 0, 0, 0, 0, f
  28. FormOnTop = 1
  29. loi:
  30. FormOnTop = 0
  31. End Function
  32.  


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

Mã: Chọn hết

  1.  
  2. Option Explicit
  3. ' Khai bao ham tro den Class cFunction
  4. Dim cF as New cFunction
  5.  
  6. Private Sub Form_Load()
  7. ' Goi va thuc hien Ham FormOnTop co trong Class cFunction
  8. cF.FormOnTop Me.Hwnd
  9. End Sub
  10.  


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.

File đính kèm : http://quantoancity.com/caulacbovb/foru ... 9e7829d390
------------------------------------------------------------------------
Bài học này của tác giả thanh3em ... Link :http://quantoancity.com/caulacbovb/forum/viewtopic.php?f=11&t=3205&st=0&sk=t&sd=a&sid=d91415ad138a600ad66fac9e7829d390&start=40
Noob is me ... hi hi :D :D

Hình đại diện của người dùng
Sparrow
Thành viên tích cực
Thành viên tích cực
Bài viết: 135
Ngày tham gia: T.Năm 27/03/2008 12:45 am
Đến từ: Lê Quý Đôn Đà Nẵng T_T
Liên hệ:

Re: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB

Gửi bàigửi bởi Sparrow » CN 30/03/2008 12:21 pm

Tên bài viết: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB
Tác giả: thanh3em
Cấp độ bài viết: Từ căn bản đến nâng cao
Tóm tắt: Học , hiểu và làm ActiveX DLL ... một việc không thể thiếu khi lập trình


Kỳ 5: Hướng dẫn các thao tác liên quan đến biên dịch ActiveX DLL hiệu quả.
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)
Hình ảnh

+ 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)
Hình ảnh
Hình ảnh
+ 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 (F8), ... 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 ...
Hình ảnh
Ở 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
------------------------------------------------------------------------
Bài học này của tác giả thanh3em ... Link : http://quantoancity.com/caulacbovb/foru ... 90&start=4
Noob is me ... hi hi :D :D

Hình đại diện của người dùng
Sparrow
Thành viên tích cực
Thành viên tích cực
Bài viết: 135
Ngày tham gia: T.Năm 27/03/2008 12:45 am
Đến từ: Lê Quý Đôn Đà Nẵng T_T
Liên hệ:

Re: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB

Gửi bàigửi bởi Sparrow » CN 30/03/2008 12:26 pm

Tên bài viết: Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB
Tác giả: thanh3em
Cấp độ bài viết: Từ căn bản đến nâng cao
Tóm tắt: Học , hiểu và làm ActiveX DLL ... một việc không thể thiếu khi lập trình


Kỳ 6: Các cách khai báo và sử dụng ActiveX DLL


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:

Mã: Chọn hết

  1. DIM <Tên biến> As New <Tên Class>
  2. Ví dụ: Dim Obj As New Object_Window
  3.  

+ 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:

Mã: Chọn hết

  1. Dim WithEvents <Tên biến> As <Tên Class>

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

Mã: Chọn hết

  1. Set <Tên biến> = New <Tên Class> </Code>
  2. Ví dụ 1:
  3. [Code=vb]
  4. Option Explicit
  5. Dim WithEvents ws As Winsock
  6. Private Sub Form_Load()
  7. Set ws = New Winsock
  8. End Sub
  9. [/Code]
  10.  
  11. Công thức gọi hàm sử dụng, thao tác gọi hàm:
  12. [Code=vb]
  13. ' Nếu là thủ tục
  14. Call <Tên biến trỏ đến Class đã khai báo>.<Tên thủ tục> (<Tham số 1>,<Tham số n>)
  15. ' Nếu là hàm
  16. <Biến gán giá trị trả về> = <Tên biến trỏ đến Class đã khai báo>.<Tên hàm> (<Tham số 1>,<Tham số n>)
  17. [/Code]
  18.  
  19. Ví dụ 2:
  20. [Code=vb]
  21. Dim Dlg As New VietDLL.Dialog
  22. Dlg.Flags = cdlOFNAllowMultiselect
  23. Dlg.ShowOpen
  24. [/Code]
  25. 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 !
  26.  
  27.  
  28. 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)
  29.  
  30. - Đầ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)
  31. - Thứ hai, xác định đúng tên của Class.
  32. 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
  33. Công thức khai báo như sau:
  34. [Code=vb]
  35. Dim <Tên biến> As Object
  36. Set <Tên biến> = CreateObject("<Tên thư viện>.<Tên Class>")
  37. [/Code]
  38. Chú ý: + Có dấu "
  39. + Có thể thay kiểu Object thành kiểu Variant
  40.  
  41. Ví dụ 3:
  42. [Code=vb]
  43. Option Explicit
  44. Dim Dlg As Object
  45. Private Sub Form_Load()
  46. Set Dlg = CreateObject("VietDLL.Dialog")
  47. Dlg.MsgboxV "Vi du mau"
  48. End Sub
  49. [/Code]
  50.  
  51. Công thức gọi hàm sử dụng, thao tác gọi hàm (tương tự cách 1):
  52. [Code=vb]
  53. ' Nếu là thủ tục
  54. Call <Tên biến trỏ đến Class đã khai báo>.<Tên thủ tục> (<Tham số 1>,<Tham số n>)
  55. ' Nếu là hàm
  56. <Biến gán giá trị trả về> = <Tên biến trỏ đến Class đã khai báo>.<Tên hàm> (<Tham số 1>,<Tham số n>)
  57. [/Code]
  58.  
  59. Và sau cùng thì phải xóa nó để tiết kiệm bộ nhớ !
  60. [Code=vb]
  61. Set <Tên biến trỏ đến Class đã khai báo> = Nothing
  62. [/Code]
  63.  
  64. 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ó
  65. Ví dụ, ở cách này thì trong thuộc tính Flags, phải nhớ cdlOFNAllowMultiselect = 512 và gán cho nó !
  66. Ví dụ 4:
  67. [Code=vb]
  68. Dim Dlg As Variant
  69. Set Dlg = CreateObject("VietDLL.Dialog")
  70. Dlg.Flags = 512
  71. Dlg.ShowOpen
  72. Set Dlg = Nothing
  73.  


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
------------------------------------------------------------------------
Bài học này của tác giả thanh3em ... Link : http://quantoancity.com/caulacbovb/foru ... 90&start=4
Noob is me ... hi hi :D :D


Quay về “[VB] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.2 khách