• 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

Cách sử dụng đường dẫn unicode trong vb6 cho mọi hàm!

Các thủ thuật về hệ thống, thư mục, tập tin và mạng
Hình đại diện của người dùng
andylam1992
Thành viên danh dự
Thành viên danh dự
Bài viết: 380
Ngày tham gia: T.Hai 06/04/2009 12:57 pm
Đến từ: TP.HCM Q5
Has thanked: 2 time
Been thanked: 4 time
Liên hệ:

Cách sử dụng đường dẫn unicode trong vb6 cho mọi hàm!

Gửi bàigửi bởi andylam1992 » T.Bảy 18/07/2009 8:41 am

Thủ thuật: Chuyển 1 tên file dạng Unicode về ASCII để thao tác
Tác giả: Sưu tầm:Bigresource.com, MSDN,1 số diễn đàn bên TQ
Mô tả: Chuyển 1 tên file dạng Unicode về ASCII để thao tác


Lúc trước mình có mở 1 toptic để hỏi về vấn đề này, kết quả trả lời của các anh, chị đều đưa ra rất nhiều câu trả lời. Trong đó bác Phú có cho code để hiển thị file name unicode với msform2.0 bác Quý có đưa ra gợi ý dùng hàm unicode API. Nhờ 2 gợi ý này lên lên google search và cho ra bài viết hôm nay. Trước hết, các API, kể cả windows đều làm việc ở dạng file name là:short Path Name (file name ở dos 8.3), vì thế muốn làm việc ta phải đưa về dạng short path name = hàm get short path name(unicode) Khi file name đưa vào hàm này thì tên đó phải ở dạng unicode, nếu không sẽ không có kết quả.
Nhờ các cao thủ user control viết thành 1 commondialogW cho anh em xài !
Cần 1 list 2.0, label 2.0
Bước đầu tiên: ta lấy tên file unicode = Commondialog(unicode) để truyền giá trị vào cho hàm "Get Short Path Name".

'trong module
-khai báo hàm API:

Mã: Chọn hết

  1.  
  2. Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameW" (pOpenfilename As OPENFILENAME) As Long
  3.  


Mã: Chọn hết

  1.  
  2. Public Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameW" (ByVal lpszLongPath As Long, ByVal lpszShortPath As Long, ByVal nBufferLength As Long) As Long
  3.  


Mã: Chọn hết

  1.  
  2. Public Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
  3. 'hàm lấy len string ở dạng pointer(byte)
  4.  


Mã: Chọn hết

  1.  
  2. Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  3. 'This is a handy utility (from the MSDN library) which converts a pointer (to a wide string) to a string
  4.  


Trong commondialog có rất nhiều cờ, ta chỉ quan tâm tới vài cờ sau(các bạn có thể tham khảo trong F2 của VB6):
- Khai báo cho commondialog:

Mã: Chọn hết

  1.  
  2. Public Const OFN_Explorer = &H80000 '524288
  3. Public Const OFN_FILEMUSTEXIST = &H1000
  4. Public Const OFN_HIDEREADONLY As Long = &H4
  5. Public Const OFN_AllowMultiSelect = 512
  6. Public sfile() As String
  7.  
  8. Public Type OPENFILENAME
  9.   lStructSize       As Long
  10.   hWndOwner         As Long
  11.   hInstance         As Long
  12.   lpstrFilter       As Long
  13.   lpstrCustomFilter As Long
  14.   nMaxCustFilter    As Long
  15.   nFilterIndex      As Long
  16.   lpstrFile         As Long
  17.   nMaxFile          As Long
  18.   lpstrFileTitle    As Long
  19.   nMaxFileTitle     As Long
  20.   lpstrInitialDir   As Long
  21.   lpstrTitle        As Long
  22.   flags             As Long
  23.   nFileOffset       As Integer
  24.   nFileExtension    As Integer
  25.   lpstrDefExt       As Long
  26.   lCustData         As Long
  27.   lpfnHook          As Long
  28.   lpTemplateName    As Long
  29. End Type
  30.  

- Code show Open:

Mã: Chọn hết

  1.  
  2. Public Function cDlgShowOpen(ByVal InitialDir As String, ByVal DialogTitle As String, ByVal Filter As String, ByVal FrmhWnd As Long) As String
  3. On Error GoTo ErrFound
  4.  
  5. Dim OpenFile As OPENFILENAME
  6. Dim lReturn As Long
  7. Dim strFile As String
  8. Dim FileFilter As String
  9.  
  10.         strFile = String(10240, 0)
  11.         OpenFile.lStructSize = Len(OpenFile)
  12.         OpenFile.hWndOwner = FrmhWnd
  13.         OpenFile.hInstance = App.hInstance
  14.        
  15.           FileFilter = Replace(Filter, "|", vbNullChar)
  16.           If AscW(Right$(FileFilter, 1)) <> 0& Then FileFilter = FileFilter & vbNullChar
  17.         OpenFile.lpstrFilter = StrPtr(FileFilter)
  18.         OpenFile.nFilterIndex = 1
  19.        
  20.         OpenFile.lpstrFile = StrPtr(strFile) 'String(257, 0)
  21.         OpenFile.nMaxFile = Len(strFile)
  22.        
  23.         OpenFile.lpstrFileTitle = StrPtr(OpenFile.lpstrFile)
  24.         OpenFile.nMaxFileTitle = StrPtr(OpenFile.nMaxFile)
  25.         OpenFile.lpstrInitialDir = StrPtr(InitialDir)
  26.         OpenFile.lpstrTitle = StrPtr(DialogTitle)
  27.         OpenFile.flags = OFN_FILEMUSTEXIST Or OFN_AllowMultiSelect Or OFN_Explorer
  28. ' nhớ có cờ explorer nhé, nếu khôn có các bạn sẽ thấy như hình dưới.
  29.         lReturn = GetOpenFileName(OpenFile)
  30.  
  31. If lReturn = 0 Then
  32. 'nút Cancel  nhấn, hay số lượng file (tổng độ dài tên của các file)> maxpath
  33. Else
  34.  
  35.     For i = 1 To LenB(strFile) ' tìm chiều dài của tên file, Vì ta khai báo maxpath lớn để phòng trường hợp số lượng tên file > MaxPath nên sẽ dư ra các kí tự vbnullchar ở sau
  36.         If (Mid(strFile, Len(strFile) - i, 1)) <> vbNullChar Then
  37.             strFile = Left$(strFile, Len(strFile) - i)
  38.             Exit For
  39.         End If
  40.     Next i
  41.           sfile = Split(strFile, vbNullChar)'chia tên file ra mảng các file với phần tử đầu là đường dẫn và các phần tử sau là tên các file mình đã chọn.
  42.           Form1.Label1.Caption = "look in: " & sfile(0) & " : Selected: " & UBound(sfile) & " File"
  43. For i = 1 To UBound(sfile)
  44.         cDlgShowOpen = sfile(i)
  45.         Form1.list1.AddItem cDlgShowOpen
  46. Next i
  47.    
  48.    
  49. End If
  50.  
  51. Exit Function
  52. ErrFound:
  53. cDlgShowOpen = ""
  54. End Function
  55.  

ko_co.JPG
Không có cờ explorer

co_co.JPG
có cờ explorer



-Bây giờ ta hãy bắt tay vào việc lấy "Short Path Name":

Mã: Chọn hết

  1.  
  2. Public Function get_path(ByVal mPathName As String) As String
  3.  
  4. Dim pPathName As Long
  5.  
  6. Dim RetVal As Long 'RetVal is used to catch the return value of GetShortPathName
  7.  
  8. Dim Buffer As String 'Buffer is the string which will hold the retrieved string
  9.  
  10. Dim pBuffer As Long 'pBuffer is a pointer to Buffer
  11.  
  12. pPathName = StrPtr(mPathName)
  13. Buffer=Space(8096)'khai báo mảng chứa tên file, mảng này cần lớn để chứa đủ tất cả các tên file
  14. pBuffer = StrPtr(Buffer)
  15.  
  16. RetVal = GetShortPathName(pPathName, pBuffer, Len(Buffer))
  17. If RetVal > 0 Then
  18. get_path = LPWSTRtoBSTR(pBuffer)' chuyển string dạng pointer sang ASCII (code bên dưới)
  19. End If
  20. End Function
  21.  


-Code cho hàm LPWSTRtoBSTR:

Mã: Chọn hết

  1.  
  2. Public Function LPWSTRtoBSTR(ByVal lpwsz As Long) As String
  3. Dim cChars As Long
  4. cChars = lstrlenW(lpwsz)' lấy độ dài string ở dạng pointer
  5. LPWSTRtoBSTR = String$(cChars, 0)' chuyển về dạng string(unicode) nhưng chưa phải tên file thực sự
  6. Call CopyMemory(ByVal StrPtr(LPWSTRtoBSTR), ByVal lpwsz, cChars * 2)' lấy địa chỉ tên file trong máy tính  thông qua tên file unicode ở trên
  7. End Function
  8.  


-Bây giờ test thử:chọn vài file trong commondialog

Mã: Chọn hết

  1.  
  2. Private Sub Form_Load()
  3. Dim f_name,f_name1
  4. f_name = cDlgShowOpen("d:\new folder\music", "OPen file", "mp3 file|*.mp3", Form1.hWnd)
  5. f_name1=get_path(sfile(0) & "\" & list1.List(0))
  6.         open f_name1 for binary access read as #1
  7.               'nếu không báo lỗi nghĩa là work
  8.                 msgbox "work!"
  9.         close #1
  10. End Sub
  11.  



不相信未作牺牲竟先可拥有
只相信是靠双手找到我欲求
Cần - Kiệm- Liêm(liêm kiết) - Nghĩa - Chí - Tín

Quay về “[VB] Hệ thống - Tập tin - Thư mục và Mạng”

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