• 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
User avatar
truongphu
VIP
VIP
Posts: 4764
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

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

Postby truongphu » Sat 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à:

Code: Select all

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:

Code: Select all

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:

Code: Select all

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

User avatar
tungblt
Điều hành viên
Điều hành viên
Posts: 550
Joined: Mon 22/12/2008 5:22 pm
Location: quy nhơn
Has thanked: 8 times
Been thanked: 77 times
Contact:

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

Postby tungblt » Sun 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


Return to “[VB] Bài viết hướng dẫn”

Who is online

Users browsing this forum: No registered users and 2 guests