• 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 đổi hàm Api_A sang APi_W với vd GetShortPathName

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
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Hướng dẫn đổi hàm Api_A sang APi_W với vd GetShortPathName

Gửi bàigửi bởi truongphu » T.Bảy 23/08/2014 11:43 pm

Tên bài viết: Hướng dẫn đổi hàm Api_A sang APi_W với vd GetShortPathName
Tác giả: truongphu
Cấp độ bài viết: căn bản VB6
Tóm tắt: Tình cờ viết một số Project cần đường dẫn unicode, tôi loay hoay mãi vì quên VB6 khá lâu!
Truy lục trên forum clbvb:
http://caulacbovb.com/mp_details.php?pid=51999
Càng đọc càng rối :-O



Ngủ một giấc,thế là tỉnh táo, từ từ phân tích, thất chuyện đơn giản vô cùng!

1- Khai báo hàm A là:

Mã: Chọn hết

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _
 (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal lBuffer As Long) As Long


trong đó lpszLongPath là path dài hay unicode,
lpszShortPath là path ngắn (ký hiệu 8.3 => 8: tên file hay Folder chỉ 8 ký hiệu, .3 là đuôi file),
lBuffer là độ dài bộ đệm.

2- Viết sang hàm W:
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" trở thành:
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW"

hoặc "chiến" hơn, viết:
Private Declare Function GetShortPathNameW Lib "kernel32"

3- Các đối số: Nhóm As String nhất định phải đổi qua As Long (địa chỉ bộ nhớ unicode)
(ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal lBuffer As Long) As Long

Toàn vẹn như sau:

Mã: Chọn hết

Private Declare Function GetShortPathNameW Lib "kernel32" _
(ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, _
ByVal nBufferLength As Long) As Long


4- Sử dụng:
Chuyển từ String qua Long ta dùng hàm StrPtr
Bộ đệm ta chơi 255 luôn, sau nầy cắt bỏ phần thừa là xong
Chú ý Function GetShortPathNameW trả về số Long [ghi cuối câu là ) As Long]

Để dễ dàng dùng sau nầy, ta viết lại Function GetShortName như sau:

Mã: Chọn hết

Function GetShortName$(ByVal sPath$)

End Function


Hàm viết lại chỉ 1 đối số string là path unicode cần chuyển.
sPath nầy đại biểu cho lpszLongPath, do lpszLongPath As Long nên sPath$ phải thành StrPtr(sPath$)

lpszShortPath là path ngắn, nhưng buộc khai báo As Long, vậy nên ta khai báo một biến String tạm:

Dim stmp$: stmp = Space(255)

2 dòng trên là cho biến tạm stmp có độ dài 255

Như vậy biến lpszShortPath sẽ là StrPtr(stmp)

Còn lBuffer As Long thì ta ghi ngay là 255.
Cuối cùng vì hàm GetShortPathNameW trả về số Long, ta khai biến Long là xong:
Dim l&

Ráp lại hàm mới:

  1. Private Declare Function GetShortPathNameW Lib "kernel32" _
  2. (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, _
  3. ByVal nBufferLength As Long) As Long
  4.  
  5. Function GetShortName$(ByVal sPath$)
  6.     Dim stmp$: stmp = Space(255)
  7.     Dim ShortName&: ShortName = StrPtr(stmp)
  8.     Dim l&: l = GetShortPathNameW(StrPtr(sPath), ShortName, 255)
  9.     GetShortName = Left(stmp, l)
  10. End Function


Đơn giản hông?


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
tungblt
Điều hành viên
Điều hành viên
Bài viết: 548
Ngày tham gia: T.Hai 22/12/2008 5:22 pm
Đến từ: quy nhơn
Has thanked: 6 time
Been thanked: 76 time
Liên hệ:

Re: Hướng dẫn đổi hàm Api_A sang APi_W với vd GetShortPathNa

Gửi bàigửi bởi tungblt » CN 24/08/2014 12:13 am

trước muốn sài được unicode với control con toàn phải đổi A thành W. với cả dùng thêm module chuyển Vni sang unicode
love


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.1 khách