Chú ý với mode của TextStream trong Scripting Object

Liên hệ QC

ThangCuAnh

Mới rờ Ét xeo
Tham gia
1/12/17
Bài viết
896
Được thích
792
Giới tính
Nam
Nghề nghiệp
Coder nghỉ hưu, RCE dạo
Ngồi "rờ em" xem cái CFileStream của scrrun.dll: Microsoft Scripting Runtime mà chửi thề, ông MS chơi ác, chỉ support call được cho dân C++, không cho dân VBA dùng.
Cũng tình cờ phát hiện ra cái CTextStream class của nó cũng có vài cái hay, nên làm file test minh họa post lên cho bà con.
Nói chung "nà" trong ruột nó test rất kỹ chuổi read lên và ghi xuống, tự động tạo đúng file content, file format mà người ta đã quy định. Nhưng user dùng sai thì ráng chịu :) Nó đã chỉ rõ ràng ra mode cụ thể trong help.
Và kết luận chung là bà con dùng Excel thì chịu khó khi ghi xuống file text thì chỉ tường mình mode là Unicode nhé, để khỏi mất dấu, và nếu có đọc từ file txt ngoài lên như mấy file .csv, .txt của các phần mềm khác xuất ra thì chịu khó kiểm tra file text đó là mode Ansi hay Unicode.
Dùng HxD Hex editor để xem.
Có gì "thét mét", trao đổi cứ mạnh dạn up lên. Và chịu khó Alt-F11, xem code trước.
 

File đính kèm

  • test_TextStream.xlsm
    23.6 KB · Đọc: 12
Lần chỉnh sửa cuối:
Mình cũng thét mét, lạ nhỉ, code CFileStream đã có, CTextStream base trên nó, chỉ việc viết thêm IDL cho dân ở ngoài như VB/VBA/VBScript dùng là được, tại sao MS không làm ??? Chỉ support TextStream, IO mode ở byte binary FileStream thì không cho, bắt phải dùng mấy hàm cũ mèm, chậm rì, mode Ansi của VB/VBA ??? Lỗi tùm lum tùm la, convert tới convert lui sai bét text buffer của coder hết ! :p
 
Upvote 0
Mình không rành mấy vụ này, nhưng mình thấy bạn phát hiện ra 1 số cái có thể phát triển được nên bạn nên gửi mail cho bên Microsoft xem ý bên họ tn.
 
Upvote 0
Hì hì, vô ích, mình và bác Tuân mất mấy tuần phát hiện ra 2 bug, 1 của Excel 64, 1 của Excel SDK. Bác Tuân đã report, nhưng "em buồn em đi ngu ngơ", chìm vào quên lãng :p
 
Upvote 0
Bà con không biết ai có thử với các text trong chuỗi A3 không nhỉ. Bà con thử thêm "đuoc" vào và bấm ghi xuống, read lên xem bị gì nhé. Ghi xuống Ansi mode vẫn OK, nhưng read Ansi mode lên vẫn bị sai nhé. Chú ý chữ "đuoc" không có dấu ư và ơ và dấu nặng nhé, chỉ đ. Chứ còn "được" luôn là văng đấy. Nó detect mà có change text content theo code page của OS là quăng về E_INVALID_PARAMETERS liền, ông VBA nhận lấy raise Err.Number = 5 ngay tắp lự.
Cái vụ đ với d này, bác Phạm Kim Long, tác giả Unikey cũng khốn khổ vì nó đấy :)
 
Lần chỉnh sửa cuối:
Upvote 0
Hì hì, thật ra lúc đầu là do mình muốn tà đạo, ăn gian, đánh lừa TextStream của scrrun.dll để đọc ghi binary luôn. Tức là "tà đạo" ở chổ, string đưa xuống vẫn là BSTR, nhưng ruột toàn byte, chả có ký tự Unicode nào ở đó, mode Ansi. Rồi cố tình read lên mode Ansi để đọc byte buffer, thế mà cũng không qua cái check, tự động convert của nó. Thêm ông VBA "lanh chanh" can thiệp vô nữa, buffer sai bé nhè :)
Thôi, tớ ứ thèm chơi với VBA và TextStream nữa, tớ có, tìm ra hàng khủng, cực mạnh, cực nhanh rồi, dễ dùng, dùng được cho VBA luôn, code 1 chút, declare API 1 chút là xong.
Bái bai, see du né vờ TextStream với IO funcs của VBA :)
 
Upvote 0
Hì hì, câu hỏi khó. "Si nghĩ "đi bạn :p
 
Upvote 0
Hì hì, thật ra lúc đầu là do mình muốn tà đạo, ăn gian, đánh lừa TextStream của scrrun.dll để đọc ghi binary luôn. Tức là "tà đạo" ở chổ, string đưa xuống vẫn là BSTR, nhưng ruột toàn byte, chả có ký tự Unicode nào ở đó, mode Ansi. Rồi cố tình read lên mode Ansi để đọc byte buffer, thế mà cũng không qua cái check, tự động convert của nó. Thêm ông VBA "lanh chanh" can thiệp vô nữa, buffer sai bé nhè :)
Thôi, tớ ứ thèm chơi với VBA và TextStream nữa, tớ có, tìm ra hàng khủng, cực mạnh, cực nhanh rồi, dễ dùng, dùng được cho VBA luôn, code 1 chút, declare API 1 chút là xong.
Bái bai, see du né vờ TextStream với IO funcs của VBA :)

Có vẻ như việc đọc và tạo file với charset loại nào vẫn là do người dùng quyết định chứ không detect tự động an toàn hơn. Như phần mềm đính kèm theo HĐH Widnows "Notepad.exe".
 
Upvote 0
Bà con chú ý nhé, dù tên file trên đĩa của bà con là không dấu hết, và không có chữ Đ luôn, nhưng lỡ tay gõ có chữ đ thì Open statement của VBA cũng văng đấy nhé. Vì nguyên nhân convert đã nói ở trên :)
 
Upvote 0
Web KT
Back
Top Bottom