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
Điểm
568
Nơi ở
Phờ lây cu
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:
trên GPE này nhiều năm thấy dân chúng lập nhiều thớt tám qua lại các kiểu cái vụ Set Dít = nothing .... vậy mò trong đó nó nói sao he @ThangCuAnh
 
Upvote 0
"Set x = Nothing" khác "Is Nothing"
Không cần mò đâu, cậu Mạnh dùng DumpMem với 1 biến object sẽ thấy ObjPtr là gì, nothing là gì, chưa có gì khi mới khai báo là gì. Thử đi, có sẵn đồ nghề rồi đó
 
Upvote 0
DumpMem với Object ra được gì chưa bạn Mạnh ?
 
Upvote 0
Tiếng anh dịch không sát nghĩa mệt thệt hihihihi
 
Upvote 0
Các bạn chạy thử đoạn code này với file ở post #93 nhé:
Mã:
Option Explicit

Public Sub Test_Object()
    Dim obj As Object
    Dim v As Variant

    Debug.Print "------- obj chua duoc khoi tao -------------"
    DumpMem VarPtr(obj), PTR_SIZE
    Debug.Print "------- v chua duoc khoi tao ---------------"
    DumpVariant v
    
    Debug.Print "------- obj duoc set = nothing -------------"
    Set obj = Nothing
    DumpMem VarPtr(obj), PTR_SIZE
    
    Debug.Print "------- v duoc set = obj--------------------"
    Set v = obj
    DumpVariant v               ' <= @thuyyeu99 chú ý o day
    Debug.Print v Is Nothing
    
    Debug.Print "------- obj duoc khoi tao tu 1 class -------"
    Set obj = CreateObject("Scripting.Dictionary")  ' ref count = 1
    DumpMem VarPtr(obj), PTR_SIZE
    Debug.Print "Pointer to the object instance of obj = " & Hex$(ObjPtr(obj))
    DumpMem ObjPtr(obj), PTR_SIZE
    
    obj.Add 0, 1
    obj.Add 1, 2
    Debug.Print "Dictionary object có Count = " & obj.count

    Debug.Print "------- v duoc set = obj -------------------"
    Set v = obj     ' ref count = 2
    DumpVariant v
    
    Debug.Print "------- obj duoc set = nothing tro lai -----"
    Set obj = Nothing   ' ref count xuong còn 1
    DumpMem VarPtr(obj), PTR_SIZE

    Debug.Print "------- v van giu pointer to obj dict ------"
    DumpVariant v
    
    v.Add 2, 3
    v.Add 3, 4
    
    Debug.Print "Dictionary object có Count = " & v.count
    DumpVariant v
    
    Debug.Print "------- v = Empty, Erase obj dict ----------"
    v = Empty           ' ref count = 0, object dictionary duoc giai phóng (free)
    DumpVariant v
    
    ' v.Add 4, 5    ' <= die here
End Sub
 
Upvote 0
Em dịch rồi anh giải quyết được vấn Is Nothing rồi ah, do em hiểu sai nghĩa thôi. Còn hàm check range viết trong Addin giờ em rút gọn chỉ cần 1 dòng Code thôi hihii
 
Upvote 0
mới thử xong ... nó như sau:
Mã:
------- obj chua duoc khoi tao -------------
003FEBD0: 00 00 00 00
------- v chua duoc khoi tao ---------------
003FEBC0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
VarType:
00 00
Reserved1-3:
00 00 00 00 00 00
Data:
00 00 00 00 00 00 00 00
------- obj duoc set = nothing -------------
003FEBD0: 00 00 00 00
------- v duoc set = obj--------------------
003FEBC0: 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
VarType:
09 00
Reserved1-3:
00 00 00 00 00 00
Data:
00 00 00 00 00 00 00 00
True
------- obj duoc khoi tao tu 1 class -------
003FEBD0: 58 65 F9 06
Pointer to the object instance of obj = 6F96558
06F96558: 1C 15 28 6B
Dictionary object có Count = 2
------- v duoc set = obj -------------------
003FEBC0: 09 00 00 00 00 00 00 00 58 65 F9 06 00 00 00 00
VarType:
09 00
Reserved1-3:
00 00 00 00 00 00
Data:
58 65 F9 06 00 00 00 00
------- obj duoc set = nothing tro lai -----
003FEBD0: 00 00 00 00
------- v van giu pointer to obj dict ------
003FEBC0: 09 00 00 00 00 00 00 00 58 65 F9 06 00 00 00 00
VarType:
09 00
Reserved1-3:
00 00 00 00 00 00
Data:
58 65 F9 06 00 00 00 00
Dictionary object có Count = 4
003FEBC0: 09 00 00 00 00 00 00 00 58 65 F9 06 00 00 00 00
VarType:
09 00
Reserved1-3:
00 00 00 00 00 00
Data:
58 65 F9 06 00 00 00 00
------- v = Empty, Erase obj dict ----------
003FEBC0: 00 00 00 00 00 00 00 00 20 5C 20 0C 00 00 00 00
VarType:
00 00
Reserved1-3:
00 00 00 00 00 00
Data:
20 5C 20 0C 00 00 00 00
 
Upvote 0
Và kết quả chạy code sẽ ra như sau, trên máy các bạn nó khác ở chỗ xxxxxxxx: thôi nhé.
Mã:
------- obj chua duoc khoi tao -------------
1. 0030ED68: 00 00 00 00
------- v chua duoc khoi tao ---------------
2. 0030ED58: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
VarType:
3. 00 00
Reserved1-3:
00 00 00 00 00 00
Data:
4. 00 00 00 00 00 00 00 00
------- obj duoc set = nothing -------------
5. 0030ED68: 00 00 00 00
------- v duoc set = obj--------------------
6. 0030ED58: 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
VarType:
7. 09 00
Reserved1-3:
00 00 00 00 00 00
Data:
00 00 00 00 00 00 00 00
True
------- obj duoc khoi tao tu 1 class -------
8. 0030ED68: 98 17 64 00
9. Pointer to the object instance of obj = 641798
10. 00641798: 88 4B 31 72
Dictionary object có Count = 2
------- v duoc set = obj -------------------
11. 0030ED58: 09 00 00 00 00 00 00 00 98 17 64 00 00 00 00 00
VarType:
12. 09 00
Reserved1-3:
00 00 00 00 00 00
Data:
13. 98 17 64 00 00 00 00 00
------- obj duoc set = nothing tro lai -----
14. 0030ED68: 00 00 00 00
------- v van giu pointer to obj dict ------
15. 0030ED58: 09 00 00 00 00 00 00 00 98 17 64 00 00 00 00 00
VarType:
16. 09 00
Reserved1-3:
00 00 00 00 00 00
Data:
17. 98 17 64 00 00 00 00 00
Dictionary object có Count = 4
18. 0030ED58: 09 00 00 00 00 00 00 00 98 17 64 00 00 00 00 00
VarType:
19. 09 00
Reserved1-3:
00 00 00 00 00 00
Data:
20. 98 17 64 00 00 00 00 00
------- v = Empty, Erase obj dict ----------
21. 0030ED58: 00 00 00 00 00 00 00 00 10 64 E4 04 00 00 00 00
VarType:
22. 00 00
Reserved1-3:
00 00 00 00 00 00
Data:
23. 00 00 00 00 00 00 00 00
 
Upvote 0
Upvote 0
Tôi sữa lại bên kết quả tôi chút để các bạn dễ đọc và thắc mắc tại dòng 1 -> 23, là những chỗ quan trong, các bạn cứ mạnh dạn bắt bẻ, vặn vẹo nhé.
Chổ quan trong nhất là chỗ 10, cần dài dòng và hình ảnh hơn để giải thích, giờ tập trung phần thô trước đã.
 
Upvote 0
if assigned(object)=false then isNothing
Range thì anh tìm hiểu Supports hoặc IDispatch , QueryInterface giống như anh "TCA" nói ở máy bài đầu ý
Thường thì Mạnh làm vầy

Mã:
object:= CreateOleObject('Scripting.Dictionary')
....
object:= Unassigned;
 
Upvote 0
vâng trong Delphi varDispatch nó là số 9 thì sao anh, em chua hiểu ý anh lắm ? (Tự về máy cái Memory em chưa hiểu lắm, mới sơ sơ chưa được tới lớp chồi nữa anh)
Từ cái số 9 em mới check is no thing và is range223261
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom