Trang 1 trên 1

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

Đã gửi: T.Bảy 23/08/2014 11:43 pm
gửi bởi truongphu
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?

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

Đã gửi: CN 24/08/2014 12:13 am
gửi bởi tungblt
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