Undocument Windows API và VBA

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
Cái laptop hư lâu lắc, phải gởi vào thành hồ chứa mưa sữa, mới lấy về.
Nên quay lại tiếp với cái gọi là "rờ chxx em" Windows và VBA.
Topic này tui sẽ đăng lần lượt những gì cu anh tui phát hiện ra trong quá trình "rờ em" Windows API, DLLs và VBAxxx.dll. Các tips, tricks này sẽ bảo đảm không có trên ông "Gấu gồ". Và dùng được cho VBA trên Offices. Chứ "ưn đồ cú mèn" API mà chỉ dùng được cho C/C++, Delphi... thì dân tin học VP ở đây thua.
Tui chỉ sẽ tập trung ở các Windows DLL sau: kernel32.dll, shell32.dll, shlwapi.dll, oleaut32.dll, ole32.dll, advapi32.dll... và 1 ít từ ntdll.dll (core usermode API của Windows). Trên VBExxx.dll thì tui chỉ tập trung vào VBE6 của Office 2007, VBE7 của Office2010 32 và 64bit, các VBExxx.dll khác cũng sẽ gần như tương đượng, không khác nhau mấy.
 
Lần chỉnh sửa cuối:
Máy tui dỏm hơn máy bạn cả trăm lần mà chạy có vài phút à mà đơ cái gì :)
À quên, máy 1 nhân (1 CPU) phụ thuộc vào số thread set trong Excel settings nữa.
 
Upvote 0
OK bạn, đúng rồi bạn, dùng 4, bạn cứ test đi. Excel nó tự detect ra máy bao nhiêu nhân mà.
PS: À quên, các bạn sữa lại hàm DumpString như sau nhé, để nó dump full cả địa chỉ:
Mã:
'
' Dump memory content of a VBA string variable to hex bytes string
' Có the dùng cho Excel de xem các char di dang trong 1 chuoi trên cell
'
Public Function DumpString(ByRef strDump As String) As String
    If StrPtr(strDump) <> 0 Then
        ' Avoid BSTR pointer of strDump is NULL, when strDump was not initialized or was assigned = vbNullString
        DumpString = DumpMem(StrPtr(strDump) - 4, LenB(strDump) + 6)
    Else
        DumpString = DumpMem(VarPtr(strDump), PTR_SIZE)
    End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
chạy hàm DumpString củ đoán mất 1 giây chi đó có ngay tức thì
1.JPG
chạy hàm DumpString bài 103 thì nó lâu hơn
Capture.JPG
 
Lần chỉnh sửa cuối:
Upvote 0
Khổ ghê, chạy hàm DumpString ngoài Excel đó, đọc lại giúp cậu ơi
 
Upvote 0
Nó nằm bên topic lập trình Delphi bằng video đó bé
 
Upvote 0
2231401566389375956.png

Mã:
ABCDEF    41 00 42 00 43 00 44 00 45 00 46 00
    0C 00 00 00 41 00 42 00 43 00 44 00 45 00 46 00 00 00
    
    
    145F0758: 0C 00 00 00 41 00 42 00 43 00 44 00 45 00 46 00 00 00
 
Upvote 0
Kéo ABCDEF hết cột A, kéo B1 hết cột B.
Công thức B1= DumpString(A1).
DumpStrinh mới nhen.
Xong Remove Duplicate, xem còn lại mấy dòng ?
Cảm ơn bạn
 
Upvote 0
Kéo mỏi tay quá mai keo tiếp
223141
 
Upvote 0
Dùng hàm cũ rồi.
Ctrl c, ctrl shft down, ctrl v, ai biểu kéo = chuột chời
 
Upvote 0
@thuyyeu99 test giùm chú vụ này đi.
Nãy giờ máy chú Excel đang chạy đơ máy luôn, chú đang ép nó chạy 1 nhân. Máy bé mấy nhân ?
 
Upvote 0
không biết anh, kiểm tra bằng cách nào ?
 
Upvote 0
Bé đọc, download file từ post 93 nhé.
 
Upvote 0
em không biết nó máy nhân nữa. của em win 7 32 bit
223166
 
Upvote 0
Máy em 4 nhân
Bài đã được tự động gộp:

Bạn mình hỏi vụ CreateThread, mình im lặng không trả lời vì muốn tìm cho ra Excel nó hoạt động thế nào, rõ mới trả lời. Đừng giận nhé bạn.
Đây là kết quả bắt Excel chạy 1 nhân, cho phép multithread. Nó sinh 1 worker thread ngoài thread chính để tính toán. Thread đó chạy song song trên 2 nhân.
Số vùng memory address cấp cho chuỗi ABCDEFGH trao đổi giữa VBA và Excel là 2.
Giờ trả về cho nó 2 nhân, chạy lại thử.
 

File đính kèm

  • 1.png
    1.png
    42.1 KB · Đọc: 15
  • 2.png
    2.png
    64.7 KB · Đọc: 15
  • 1.png
    1.png
    21.3 KB · Đọc: 13
Lần chỉnh sửa cuối:
Upvote 0
Máy em 4 nhân
Bài đã được tự động gộp:

Bạn mình hỏi vụ CreateThread, mình im lặng không trả lời vì muốn tìm cho ra Excel nó hoạt động thế nào, rõ mới trả lời. Đừng giận nhé bạn.
Đây là kết quả bắt Excel chạy 1 nhân, cho phép multithread. Nó sinh 1 worker thread ngoài thread chính để tính toán. Thread đó chạy song song trên 2 nhân.
Số vùng memory address cấp cho chuỗi ABCDEFGH trao đổi giữa VBA và Excel là 2.
Giờ trả về cho nó 2 nhân, chạy lại thử.
Cả triệu dòng không biết khi nào xong hichic
 
Upvote 0
Khi bật 2 nhân cho Excel, kết quả trên máy tôi, vùng nhớ trao đổi giữa VBA và Excel vẫn là 2, nhưng số thread tham gia tính toán thay đổi đáng kể.
Excel GUI thread (thread chính) giờ lên 2, Worker thread chính để tính toán vẫn là 1, nhưng tại sao lại có sự tham gia của các thread lạ của MSO.dll và 2 đến 3 từ ông Windows bắn ra ? Ông từ winmm.dll có thread priority cao nhất (Highest), ông từ ntdll.dll lâu lâu phọt ra 1 cái rồi biến mất, phải canh nhanh tay chụp màn hình mới được.
Sợ máy bà con nhanh quá không thấy rõ đâu.
 

File đính kèm

  • 3.png
    3.png
    22.6 KB · Đọc: 15
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom