找回密码
 加入
搜索
查看: 11410|回复: 24

[AU3基础] DLL文件里的函数怎么查看?

 火... [复制链接]
发表于 2012-10-9 21:36:50 | 显示全部楼层 |阅读模式
各位前辈们,请问DLL文件哪里查看?我看到有些常用的DLL,但是里面的函数要怎么看?
小弟新手,请各位大牛指点一下哈。
发表于 2012-10-9 22:17:54 | 显示全部楼层
好像是老外写的,以前收集的,看看对你是否有参考




#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

; TYPELIB VIEWER
;.......script written by trancexx (trancexx at yahoo dot com)

Opt("WinWaitDelay", 0) ; 0 ms

HotKeySet("{ESC}", "_TLB_Quit")
Func _TLB_Quit()
        Exit
EndFunc   ;==>_TLB_Quit

; DLLs to use
Global Const $hKERNEL32 = DllOpen("kernel32.dll")
Global Const $hUSER32 = DllOpen("user32.dll")
Global Const $hSHELL32 = DllOpen("shell32.dll")

Global $aTypelib[1]

; GUI
Global $hGUI = GUICreate("TLB Viewer ", 500, 500, -1, -1, 0xCF0000, 16) ; WS_OVERLAPPEDWINDOW, $WS_EX_ACCEPTFILES
;GUISetIcon(@SystemDir & "\msdxm.tlb")
Global $hEditViewTLB = GUICtrlCreateEdit("", 10, 10, 480, 420, 0x3018C0) ; $ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY   ;0x804) ; ES_READONLY|ES_MULTILINE
GUICtrlSetResizing(-1, 102)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlSetFont(-1, 9, 400, 0, "Tahoma", 5)
Global $hButtonBrowse = GUICtrlCreateButton("&Open", 20, 455, 70, 25)
GUICtrlSetResizing(-1, 834)
GUICtrlSetTip(-1, "Browse for TLB")
Global $hButtonNew = GUICtrlCreateButton("O&ther", 95, 455, 70, 25)
GUICtrlSetResizing(-1, 834)
GUICtrlSetState(-1, 128) ; $GUI_DISABLE
GUICtrlSetTip(-1, "Select different TLB found inside loaded file")
Global $hButtonClose = GUICtrlCreateButton("Cl&ose", 365, 455, 90, 25)
GUICtrlSetResizing(-1, 836)
GUICtrlSetTip(-1, "Close this window")

Global $hDots = _TLB_CreateDragDots($hGUI)
; Additional win message processing
GUIRegisterMsg(5, "_TLB_WM_SIZE") ; WM_SIZE
GUIRegisterMsg(36, "_TLB_WM_GETMINMAXINFO") ; WM_GETMINMAXINFO
GUIRegisterMsg(563, "_TLB_WM_DROPFILES") ; WM_DROPFILES
; Show the GUI
GUISetState()

Global $sTLB ; file to load
Global $sTLBLoaded ; loaded file
Global $sTypeLibString
Global $aNameLang, $iIndex

If @Compiled Then $sTLB = StringReplace($CmdLineRaw, '"', "")

While 1
        Switch GUIGetMsg()
                Case -3, $hButtonClose
                        Exit
                Case $hButtonBrowse
                        $sTLB = FileOpenDialog("TLB Viewer ", "", "TLB(*.tlb;*.exe;*.dll;*.ocx)|(*.tlb)|(*.ocx)|All files(*)", 1, "", $hGUI)
                Case $hButtonNew
                        $sTLB = $sTLBLoaded
        EndSwitch
        If $sTLB Then
                GUISetCursor(15, 1)
                GUISetState(@SW_LOCK, $hGUI)
                $sTLBLoaded = _TLB_GetTYPELIBS($sTLB)
                If @error Then
                        $sTypeLibString = _TLB_TypelibMSFT(FileRead($sTLBLoaded), 0, 0, 0, True)
                        If @error Then MsgBox(64, "No Typelib", "No MSFT Typelib inside this file!", 0, $hGUI)
                        GUICtrlSetData($hEditViewTLB, $sTypeLibString)
                        GUICtrlSetState($hButtonNew, 128) ; $GUI_DISABLE
                Else
                        $iIndex = _TLB_ChooseTLB($aTypelib)
                        $aNameLang = _TLB_GetNameLang($aTypelib, $iIndex)
                        $sTypeLibString = _TLB_TypelibMSFT($sTLBLoaded, "TYPELIB", $aNameLang[0], $aNameLang[1])
                        GUICtrlSetData($hEditViewTLB, $sTypeLibString)
                        If UBound($aTypelib) > 1 Then
                                GUICtrlSetState($hButtonNew, 64) ; $GUI_ENABLE
                        Else
                                GUICtrlSetState($hButtonNew, 128) ; $GUI_DISABLE
                        EndIf
                EndIf
                GUISetState(@SW_UNLOCK, $hGUI)
                GUISetCursor(-1)
                GUICtrlSetData($hButtonBrowse, "&New")
                WinActivate($hGUI)
                WinSetTitle($hGUI, 0, "TLB Viewer - " & StringRegExpReplace($sTLBLoaded, ".*\\", ""))
                $sTLB = ""
        EndIf
WEnd


; GUI related functions...
Func _TLB_ChooseTLB($aArray)
        Local $iUbound = UBound($aArray)
        If $iUbound = 1 Then Return 0
        Local $iOut = 0
        Local $hGUIOther = GUICreate("Multiple TYPELIBs", 400, 200 + 30 * $iUbound, -1, -1, 0x80000, -1, $hGUI) ; WS_SYSMENU
        GUICtrlCreateLabel("-TYPELIBs found inside (select one to view):", 20, 20, 360, 20)
        GUICtrlSetColor(-1, 0x0000CC)
        GUICtrlSetFont(-1, 11, 600, 0, "Trebuchet MS", 5)
        Local $hClose = GUICtrlCreateButton("&OK", 300, 120 + 30 * $iUbound, 80, 25)
        GUICtrlSetTip(-1, "Load choosen Typelib")
        Local $aCheckBox[$iUbound]
        For $i = 0 To $iUbound - 1
                $aNameLang = _TLB_GetNameLang($aArray, $i)
                If $i = 0 Then
                        $aCheckBox[$i] = GUICtrlCreateCheckbox(" TLB Name: " & $aNameLang[0] & "    Lang: " & $aNameLang[1] & "   (default)", 30, 60 + 30 * $i, 340, 20)
                        GUICtrlSetState(-1, 1)
                        GUICtrlSetFont($aCheckBox[$i], 9, 600, 2, "Trebuchet MS", 5)
                Else
                        $aCheckBox[$i] = GUICtrlCreateCheckbox(" TLB Name: " & $aNameLang[0] & "    Lang: " & $aNameLang[1], 30, 60 + 30 * $i, 340, 20)
                        GUICtrlSetFont($aCheckBox[$i], 9, 400, 2, "Trebuchet MS", 5)
                EndIf
        Next
        GUISetState(@SW_DISABLE, $hGUI)
        GUISetState(@SW_SHOW, $hGUIOther)
        Local $iMsg
        While 1
                $iMsg = GUIGetMsg()
                Switch $iMsg
                        Case -3, $hClose
                                ExitLoop
                EndSwitch
                For $i = 0 To $iUbound - 1
                        If $iMsg = $aCheckBox[$i] Then
                                $iOut = $i
                                GUICtrlSetFont($aCheckBox[$i], 9, 600, 2, "Trebuchet MS", 5)
                                For $j = 0 To $iUbound - 1
                                        If $j <> $i Then
                                                GUICtrlSetState($aCheckBox[$j], 4)
                                                GUICtrlSetFont($aCheckBox[$j], 9, 400, 2, "Trebuchet MS", 5)
                                        EndIf
                                Next
                        EndIf
                Next
        WEnd
        GUISetState(@SW_ENABLE, $hGUI)
        GUIDelete($hGUIOther)
        Return $iOut
EndFunc   ;==>_TLB_ChooseTLB

Func _TLB_GetNameLang($aArray, $iIndex = 0)
        Local $aOut = StringSplit($aArray[$iIndex], ";", 2)
        If UBound($aOut) <> 2 Then
                $aOut = StringSplit("  ", "", 2)
                MsgBox(64, "No Typelib", "No MSFT Typelib inside this file!", 0, $hGUI)
                Return $aOut
        EndIf
        If Number($aOut[0]) = $aOut[0] Then $aOut[0] = Number($aOut[0])
        If Number($aOut[1]) = $aOut[1] Then $aOut[1] = Number($aOut[1])
        Return $aOut
EndFunc   ;==>_TLB_GetNameLang

Func _TLB_GetTYPELIBS($sModule)
        ReDim $aTypelib[1]
        $aTypelib[0] = ""
        Local $aShortcut = FileGetShortcut($sModule)
        If Not @error Then $sModule = $aShortcut[0]
        DllCall($hKERNEL32, "boolean", "Wow64EnableWow64FsRedirection", "boolean", 0)
        _TLB_EnumTypelibs($sModule)
        If @error Then
                DllCall($hKERNEL32, "boolean", "Wow64EnableWow64FsRedirection", "boolean", 1)
                Return SetError(1, 0, $sModule)
        EndIf
        DllCall($hKERNEL32, "boolean", "Wow64EnableWow64FsRedirection", "boolean", 1)
        Local $iUbound = UBound($aTypelib) - 1 ; the last element is leftover. Ditching it...
        If $iUbound Then ReDim $aTypelib[$iUbound]
        Return $sModule
EndFunc   ;==>_TLB_GetTYPELIBS



; Heart-beat functions...
Func _TLB_TypelibMSFT($vModule, $vResType, $vResName, $iResLang, $fBinary = False)
        Local $bBinary
        If $fBinary Then
                $bBinary = $vModule
        Else
                $bBinary = _TLB_ResourceGetAsRaw($vModule, $vResType, $vResName, $iResLang)
        EndIf
        If Not $bBinary Then Return SetError(1, 0, "")
        If BinaryMid($bBinary, 1, 4) <> Binary("MSFT") Then Return SetError(2, 0, "")
        Local $tBinary = DllStructCreate("byte[" & BinaryLen($bBinary) & "]")
        DllStructSetData($tBinary, 1, $bBinary)
        Local $pTypeLib = DllStructGetPtr($tBinary)
        Local $pPointer = $pTypeLib
        Local $tTypeLib = DllStructCreate("char Magic[4];" & _
                        "int VersionNum;" & _
                        "int GUIDOffset;" & _
                        "int LocaleID;" & _
                        "int Unknown;" & _
                        "int VarFlags;" & _
                        "int Version;" & _
                        "int Flags;" & _
                        "int TypeInfoCount;" & _
                        "int HelpStringOffset;" & _
                        "int HelpStringContext;" & _
                        "int HelpContext;" & _
                        "int NameTableCount;" & _
                        "int NameTableChars;" & _
                        "int TypeLibNameOffset;" & _
                        "int HelpFileNameOffset;" & _
                        "int CustomDataOffset;" & _
                        "int Reserved1;" & _
                        "int Reserved2;" & _
                        "int DispatchPosition;" & _
                        "int ImportInfoCount;", _
                        $pPointer)
        $pPointer += DllStructGetSize($tTypeLib) ; 84
        ; Possible correction
        If BitAND(BitShift(DllStructGetData($tTypeLib, "VarFlags"), 8), 1) Then $pPointer += 4
        Local $tTypeInfos = DllStructCreate("int Offset[" & DllStructGetData($tTypeLib, "TypeInfoCount") & "]", $pPointer)
        $pPointer += DllStructGetSize($tTypeInfos)
        Local $pSegDesc = $pPointer
        Local $iValidTypeInfoOffset = _TLB_SegDesc($pSegDesc, 1, True)
        Local $iValidRefOffset = _TLB_SegDesc($pSegDesc, 4, True)
        Local $iValidGUIDOffset = _TLB_SegDesc($pSegDesc, 6, True)
        Local $iValidNameOffset = _TLB_SegDesc($pSegDesc, 8, True)
        Local $iValidStringOffset = _TLB_SegDesc($pSegDesc, 9, True)
        Local $iValidCustomDataOffset = _TLB_SegDesc($pSegDesc, 12, True)
        Local $sData = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" & @CRLF
        $sData &= _TLB_Name($iValidNameOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 8), DllStructGetData($tTypeLib, "TypeLibNameOffset")) & ";" & _
                        _TLB_String($iValidStringOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 9), DllStructGetData($tTypeLib, "HelpStringOffset"), " // ") & @CRLF & _
                        "UUID " & _TLB_GUID($iValidGUIDOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 6), DllStructGetData($tTypeLib, "GUIDOffset")) & ";" & @CRLF
        $sData &= "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" & @CRLF & @CRLF & @CRLF & @CRLF
        $sData &= "==================================================================================" & @CRLF & @CRLF
        For $i = 1 To DllStructGetData($tTypeLib, "TypeInfoCount")
                ; 1. TypeInfo Table
                $sData &= _TLB_TypeInfo($iValidTypeInfoOffset, $iValidRefOffset, $iValidGUIDOffset, $iValidNameOffset, $iValidStringOffset, $iValidCustomDataOffset, $pTypeLib, $pSegDesc, DllStructGetData($tTypeInfos, "Offset", $i))
                ; 2. ImportInfo Table +
                ; 3. Imported TypeLib Table
                ; 4. References Table +
                ; 5. Lib Table
                ; 6. GUID Table
                ; 7. Unknown 01
                ; 8. Name Table +
                ; 9. String Table +
                ; 10. Type Descriptors +
                ; 11. Array Descriptors
                ; 12. Custom Data +
                ; 13. GUID Offsets +
                ; 14. Unknown 02
                ; 15. Unknown 03
                $sData &= "==================================================================================" & @CRLF & @CRLF
        Next
        Return $sData
EndFunc   ;==>_TLB_TypelibMSFT

Func _TLB_ImportInfo($iValidGUIDOffset, $iValidStringOffset, $pTypeLib, $pSegDesc, $iTypeKind)
        Local $sData
        Local $tImportInfo = DllStructCreate("short Count;" & _
                        "byte Flags;" & _
                        "byte TypeKind;" & _
                        "int ImportFile;" & _
                        "int GUID;", _
                        $pTypeLib + _TLB_SegDesc($pSegDesc, 2))
        If DllStructGetData($tImportInfo, "ImportFile") Then $sData &= _TLB_String($iValidStringOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 9), DllStructGetData($tImportInfo, "ImportFile"), "Import File: ") & @CRLF
        If BitAND(DllStructGetData($tImportInfo, "Flags"), 1) Then; indicates GUID
                Switch $iTypeKind
                        Case 4
                                Local $sGUIDParent = _TLB_GUID($iValidGUIDOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 6), DllStructGetData($tImportInfo, "GUID"))
                                $sData &= "// Inherits from:" & _TLB_InterfaceName($sGUIDParent) & @CRLF
                        Case Else
                                ; Something else
                EndSwitch
        Else
                ; FIXME ; "GUID" is a TypeInfo index
        EndIf
        Return $sData
EndFunc   ;==>_TLB_ImportInfo

Func _TLB_TypeInfo($iValidTypeInfoOffset, $iValidRefOffset, $iValidGUIDOffset, $iValidNameOffset, $iValidStringOffset, $iValidCustomDataOffset, $pTypeLib, $pSegDesc, $iOffset, $fRetName = False)
        If $iOffset < 0 Or $iOffset > $iValidTypeInfoOffset Then Return @CRLF
        Local $sData
        Local $tTypeInfo = DllStructCreate("int TypeKind;" & _
                        "int FunctionRecords;" & _
                        "int MemoryAllocation;" & _
                        "int ReconstitutedSize;" & _
                        "int Reserved1;" & _
                        "int Reserved2;" & _
                        "short FunctionCount;" & _
                        "short PropertyCount;" & _
                        "int Reserved3;" & _
                        "int Reserved4;" & _
                        "int Reserved5;" & _
                        "int Reserved6;" & _
                        "int GUID;" & _
                        "int TypeFlags;" & _
                        "int Name;" & _
                        "int Version;" & _
                        "int DocString;" & _
                        "int HelpStringContext;" & _
                        "int HelpContext;" & _
                        "int CustomData;" & _
                        "short ImplementedInterfaces;" & _
                        "short VirtualTableSize;" & _
                        "int Unknown3;" & _
                        "int DataType1;" & _
                        "int DataType2;" & _
                        "int Reserved7;" & _
                        "int Reserved8;", _
                        $pTypeLib + _TLB_SegDesc($pSegDesc, 1) + $iOffset)
        If $fRetName Then Return "<" & _TLB_TypeKind(BitAND(DllStructGetData($tTypeInfo, "TypeKind"), 0xF)) & "> " & _TLB_Name($iValidNameOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 8), DllStructGetData($tTypeInfo, "Name"))
        $sData &= _TLB_TypeKind(BitAND(DllStructGetData($tTypeInfo, "TypeKind"), 0xF)) & " "
        $sData &= _TLB_Name($iValidNameOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 8), DllStructGetData($tTypeInfo, "Name")) & ";"
        $sData &= _TLB_String($iValidStringOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 9), DllStructGetData($tTypeInfo, "DocString"), " // ")
        $sData &= @CRLF
        Local $iTypeKind = BitAND(DllStructGetData($tTypeInfo, "TypeKind"), 0xF)
        Switch $iTypeKind
                Case 0, 1, 7 ; enum, struct, union
                        ; nothing
                Case 6 ; alias
                        If BitShift(DllStructGetData($tTypeInfo, "DataType1"), 31) Then
                                $sData &= _TLB_GetType(BitAND(DllStructGetData($tTypeInfo, "DataType1"), 0xFFFF)) & "; " & @CRLF & @CRLF
                        Else
                                $sData &= _TLB_CustomType($iValidTypeInfoOffset, $iValidRefOffset, $iValidGUIDOffset, $iValidNameOffset, $iValidStringOffset, $iValidCustomDataOffset, $pTypeLib, $pSegDesc, DllStructGetData($tTypeInfo, "DataType1")) & "; " & @CRLF & @CRLF
                        EndIf
                Case 3 ; Interface
                        ; DataType1 is a reference to inherited interface
                        $sData &= "IID = " & _TLB_GUID($iValidGUIDOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 6), DllStructGetData($tTypeInfo, "GUID")) & "; " & @CRLF
                        If DllStructGetData($tTypeInfo, "DataType1") <> -1 Then $sData &= "// Inherits from: IUnknown {00000000-0000-0000-C000-000000000046}" & @CRLF ; <-!!!
                        $sData &= _TLB_ImportInfo($iValidGUIDOffset, $iValidStringOffset, $pTypeLib, $pSegDesc, $iTypeKind) & @CRLF
                Case 4 ; IDispatch
                        $sData &= "IID = " & _TLB_GUID($iValidGUIDOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 6), DllStructGetData($tTypeInfo, "GUID")) & "; " & @CRLF
                        $sData &= _TLB_ImportInfo($iValidGUIDOffset, $iValidStringOffset, $pTypeLib, $pSegDesc, $iTypeKind) & @CRLF
                Case 2 ; Module
                        ; DataType1 is an offset into the Name Table of the DllName
                        ;Local $sDLLName = _TLB_Name($iValidNameOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 8), DllStructGetData($tTypeInfo, "DataType1"))
                        ;If $sDLLName Then $sData &= $sDLLName & ";"
                        $sData &= @CRLF
                Case 5 ; coclass
                        $sData &= "CLSID = " & _TLB_GUID($iValidGUIDOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 6), DllStructGetData($tTypeInfo, "GUID")) & "; " & @CRLF & @CRLF
                        ; DataType1 is an offset into RefTable
                        Local $aRef = _TLB_Ref($iValidRefOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 4), DllStructGetData($tTypeInfo, "DataType1"))
                        For $i = 0 To UBound($aRef) - 1
                                $aRef[$i] = Number($aRef[$i])
                                If $aRef[$i] >= 0 Then $sData &= "// Implemented interface: " & _TLB_TypeInfo($iValidTypeInfoOffset, $iValidRefOffset, $iValidGUIDOffset, $iValidNameOffset, $iValidStringOffset, $iValidCustomDataOffset, $pTypeLib, $pSegDesc, $aRef[$i], True) & @CRLF
                        Next
                Case Else
                        $sData &= "GUID = " & _TLB_GUID($iValidGUIDOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 6), DllStructGetData($tTypeInfo, "GUID")) & "; " & @CRLF & @CRLF
        EndSwitch
        $sData &= _TLB_FuncProp($iValidTypeInfoOffset, $iValidRefOffset, $iValidGUIDOffset, $iValidNameOffset, $iValidStringOffset, $iValidCustomDataOffset, $pTypeLib, $pSegDesc, DllStructGetData($tTypeInfo, "FunctionRecords"), DllStructGetData($tTypeInfo, "FunctionCount"), DllStructGetData($tTypeInfo, "PropertyCount"), BitAND(DllStructGetData($tTypeInfo, "TypeKind"), 0xF))
        Return $sData
EndFunc   ;==>_TLB_TypeInfo

Func _TLB_FuncProp($iValidTypeInfoOffset, $iValidRefOffset, $iValidGUIDOffset, $iValidNameOffset, $iValidStringOffset, $iValidCustomDataOffset, $pTypeLib, $pSegDesc, $iOffset, $iNumFunc = 0, $iNumProp = 0, $iTypeKind = 0)
        Local $pPointer = $pTypeLib + $iOffset
        $pPointer += 4 ; first int value is the size of FuncPropRec structure. Skipping that.
        Local $aString[$iNumFunc + $iNumProp + 1]
        Local $iMinSize, $sParamName
        Local $tFuncRecord
        Local $tParameterInfo, $pParameterInfo
        For $i = 1 To $iNumFunc
                $tFuncRecord = DllStructCreate("word RecordSize;" & _
                                "word VTableEntry;" & _
                                "short DataType;" & _
                                "short Flags;" & _
                                "int Reserved1;" & _
                                "short VirtualTable;" & _
                                "short FuncDescSize;" & _
                                "int FKCCIC;" & _
                                "short ParameterCount;" & _
                                "short Unknown2;" & _
                                "int HelpContext;" & _
                                "int HelpString;" & _
                                "int Entry;" & _
                                "int Reserved2;" & _
                                "int Reserved3;" & _
                                "int HelpStringContext;" & _
                                "int CustomData;", _
                                $pPointer)
                $pPointer += DllStructGetData($tFuncRecord, "RecordSize")
                $iMinSize = DllStructGetData($tFuncRecord, "RecordSize") - 12 * DllStructGetData($tFuncRecord, "ParameterCount")
                If BitAND(BitShift(DllStructGetData($tFuncRecord, "FKCCIC"), 7), 1) Then
                        $aString[$i - 1] = _TLB_CustomType($iValidTypeInfoOffset, $iValidRefOffset, $iValidGUIDOffset, $iValidNameOffset, $iValidStringOffset, $iValidCustomDataOffset, $pTypeLib, $pSegDesc, _TLB_SegDesc($pSegDesc, 10), DllStructGetData($tFuncRecord, "DataType")) & " "
                Else
                        $aString[$i - 1] = _TLB_GetType(DllStructGetData($tFuncRecord, "DataType")) & " "
                EndIf
                $aString[$i - 1] = _TLB_FuncType(BitAND(DllStructGetData($tFuncRecord, "FKCCIC"), 0x7)) & ";" & @CRLF & "        " & $aString[$i - 1]
                $aString[$i - 1] = _TLB_InvocationKind(BitAND(BitShift(DllStructGetData($tFuncRecord, "FKCCIC"), 3), 0xF)) & $aString[$i - 1]
                $aString[$i - 1] = _TLB_CallingConvention(BitAND(BitShift(DllStructGetData($tFuncRecord, "FKCCIC"), 8), 0xF)) & $aString[$i - 1]
                If $iMinSize > 28 Then
                        $aString[$i - 1] = _TLB_String($iValidStringOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 9), DllStructGetData($tFuncRecord, "HelpString")) & @CRLF & $aString[$i - 1]
                Else
                        $aString[$i - 1] = @CRLF & $aString[$i - 1]
                EndIf
                $aString[$i - 1] &= "(" & @CRLF
                $pParameterInfo = DllStructGetPtr($tFuncRecord) + $iMinSize
                For $j = 1 To DllStructGetData($tFuncRecord, "ParameterCount")
                        $tParameterInfo = DllStructCreate("short DataType;" & _
                                        "short Flags;" & _
                                        "int Name;" & _
                                        "int ParamFlags;", _
                                        $pParameterInfo)
                        $aString[$i - 1] &= _TLB_GetFlagString(DllStructGetData($tParameterInfo, "ParamFlags"))
                        If DllStructGetData($tParameterInfo, "Flags") Then
                                $aString[$i - 1] &= _TLB_GetType(DllStructGetData($tParameterInfo, "DataType"))
                        Else
                                $aString[$i - 1] &= _TLB_CustomType($iValidTypeInfoOffset, $iValidRefOffset, $iValidGUIDOffset, $iValidNameOffset, $iValidStringOffset, $iValidCustomDataOffset, $pTypeLib, $pSegDesc, DllStructGetData($tParameterInfo, "DataType"))
                        EndIf
                        If DllStructGetData($tParameterInfo, "Name") <> -1 Then $sParamName = _TLB_Name($iValidNameOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 8), DllStructGetData($tParameterInfo, "Name"))
                        $aString[$i - 1] &= " " & $sParamName
                        If $j = DllStructGetData($tFuncRecord, "ParameterCount") Then
                                $aString[$i - 1] &= @CRLF
                        Else
                                $aString[$i - 1] &= ", " & @CRLF
                        EndIf
                        $pParameterInfo += 12 ; size of $tParameterInfo
                Next
                $aString[$i - 1] &= "         );" & @CRLF
        Next
        For $i = 1 To $iNumProp
                Local $tPropRecord = DllStructCreate("word RecordSize;" & _
                                "word PropNum;" & _
                                "short DataType;" & _
                                "short Flags;" & _
                                "int VarKind;" & _
                                "int VarDescSize;" & _
                                "int OffsValue;" & _
                                "int Unknown;" & _
                                "int HelpContext;" & _
                                "int HelpString;" & _
                                "int Reserved;" & _
                                "int CustomData;" & _
                                "int HelpStringContext;", _
                                $pPointer)
                If DllStructGetData($tPropRecord, "RecordSize") > 24 Then $aString[$i + $iNumFunc - 1] = _TLB_String($iValidStringOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 9), DllStructGetData($tPropRecord, "HelpString")) & @CRLF
                If BitShift(DllStructGetData($tPropRecord, "OffsValue"), 31) Then ; If MSB set
                        $aString[$iNumFunc + $i - 1] = " = " & BitAND(DllStructGetData($tPropRecord, "OffsValue"), 0xFFFF)
                Else
                        Switch $iTypeKind
                                Case 1, 7
                                        Local $sTypeParam
                                        Switch DllStructGetData($tPropRecord, "DataType")
                                                Case 30
                                                        $aString[$iNumFunc + $i - 1] = "   ptr[str]@S@"
                                                Case 31
                                                        $aString[$iNumFunc + $i - 1] = "   ptr[wstr]@S@"
                                                Case Else
                                                        If BitShift(DllStructGetData($tPropRecord, "DataType"), 7) Then
                                                                $aString[$iNumFunc + $i - 1] = "  " & _TLB_CustomType($iValidTypeInfoOffset, $iValidRefOffset, $iValidGUIDOffset, $iValidNameOffset, $iValidStringOffset, $iValidCustomDataOffset, $pTypeLib, $pSegDesc, DllStructGetData($tPropRecord, "DataType")) & "@S@"
                                                        Else
                                                                $sTypeParam = _TLB_GetType(DllStructGetData($tPropRecord, "DataType"))
                                                                If @extended Then $sTypeParam = _TLB_CustomType($iValidTypeInfoOffset, $iValidRefOffset, $iValidGUIDOffset, $iValidNameOffset, $iValidStringOffset, $iValidCustomDataOffset, $pTypeLib, $pSegDesc, DllStructGetData($tPropRecord, "DataType"))
                                                                $aString[$iNumFunc + $i - 1] = "  " & $sTypeParam & "@S@"
                                                        EndIf
                                        EndSwitch
                                Case Else
                                        $aString[$iNumFunc + $i - 1] = " = " & _TLB_CustomData($iValidCustomDataOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 12), BitAND(DllStructGetData($tPropRecord, "OffsValue"), 0xFFFF))
                        EndSwitch
                EndIf
                $pPointer += DllStructGetData($tPropRecord, "RecordSize")
        Next
        Local $tMethodPropertyID = DllStructCreate("dword[" & $iNumFunc + $iNumProp & "]", $pPointer)
        $pPointer += DllStructGetSize($tMethodPropertyID)
        Local $tNameOffsets = DllStructCreate("dword[" & $iNumFunc + $iNumProp & "]", $pPointer)
        $pPointer += DllStructGetSize($tNameOffsets)
        For $i = 1 To $iNumFunc + $iNumProp
                $aString[$i - 1] = StringReplace($aString[$i - 1], "(", _TLB_Name($iValidNameOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 8), DllStructGetData($tNameOffsets, 1, $i)) & "(")
                If $i > $iNumFunc Then
                        If StringRight($aString[$i - 1], 3) = "@S@" Then
                                $aString[$i - 1] = StringTrimRight($aString[$i - 1], 3) & " " & _TLB_Name($iValidNameOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 8), DllStructGetData($tNameOffsets, 1, $i)) & ";"
                        Else
                                $aString[$i - 1] = "  " & _TLB_Name($iValidNameOffset, $pTypeLib + _TLB_SegDesc($pSegDesc, 8), DllStructGetData($tNameOffsets, 1, $i)) & $aString[$i - 1] & ","
                        EndIf
                EndIf
        Next
        If $iNumProp Then
                $aString[$iNumFunc] = "{" & @CRLF & $aString[$iNumFunc]
                $aString[$iNumProp + $iNumFunc - 1] = StringReplace($aString[$iNumProp + $iNumFunc - 1], ",", "") & @CRLF & "};" & @CRLF
        EndIf
        Local $sString
        For $i = 1 To $iNumFunc + $iNumProp + 1
                If $i > $iNumFunc Then
                        $sString &= $aString[$i - 1] & @CRLF
                Else
                        $sString &= "    " & $i & ". " & $aString[$i - 1] & @CRLF
                EndIf
        Next
        Return $sString
EndFunc   ;==>_TLB_FuncProp

Func _TLB_CustomType($iValidTypeInfoOffset, $iValidRefOffset, $iValidGUIDOffset, $iValidNameOffset, $iValidStringOffset, $iValidCustomDataOffset, $pTypeLib, $pSegDesc, $iOffset, $sData = "")
        Local $sOut, $fRet, $iTypeDescTableOffset
        Local $iPrimaryDataType, $iBaseDataType, $iVector, $iArray, $iPointer, $iRound
        While 1
                $iRound += 1
                If $iRound = 12 Then ExitLoop ; if something goes wrong
                Local $tTypeDesc = DllStructCreate("short Val1;" & _
                                "short Val2;" & _
                                "short Val3;" & _
                                "short Val4;", _
                                $pTypeLib + _TLB_SegDesc($pSegDesc, 10) + $iOffset)
                $iPrimaryDataType = BitAND(DllStructGetData($tTypeDesc, "Val1"), 0x7FF)
                $iBaseDataType = BitAND(DllStructGetData($tTypeDesc, "Val2"), 0x7FF)
                $iVector = BitAND(BitShift(DllStructGetData($tTypeDesc, "Val2"), 12), 1)
                $iArray = BitAND(BitShift(DllStructGetData($tTypeDesc, "Val2"), 13), 1)
                $iPointer = BitAND(BitShift(DllStructGetData($tTypeDesc, "Val2"), 14), 1)
                If BitAND(DllStructGetData($tTypeDesc, "Val2"), 0x7FFE) = 0x7FFE Then
                        If $iPrimaryDataType = 26 Then
                                $sOut &= "*"
                        Else
                                $fRet = True
                        EndIf
                Else
                        If $iPointer Then
                                $sOut &= _TLB_GetType($iBaseDataType) & "*"
                        Else
                                If $iVector Then
                                        $sOut &= "(VectorOf " & _TLB_GetType($iPrimaryDataType) & ")" ; <-!!!
                                ElseIf $iArray Then
                                        $sOut &= _TLB_GetType($iPrimaryDataType)
                                EndIf
                        EndIf
                        $fRet = True
                EndIf
                Switch $iPrimaryDataType
                        Case 26, 27 ; VT_PTR, VT_SAFEARRAY
                                If BitShift(DllStructGetData($tTypeDesc, "Val4"), 31) Then ; If MSB is set
                                        $iTypeDescTableOffset = BitAND(DllStructGetData($tTypeDesc, "Val3"), 0x7FF8)
                                        ;ConsoleWrite("-" & $iTypeDescTableOffset & "    " & $iBaseDataType & @CRLF)
                                Else
                                        $iTypeDescTableOffset = BitAND(BitOR(BitShift(DllStructGetData($tTypeDesc, "Val2"), -16), DllStructGetData($tTypeDesc, "Val3")), DllStructGetData($tTypeDesc, "Val3"))
                                EndIf
                        Case 28 ; VT_CARRAY
                                Local $iArrayDescTableOffset = BitOR(BitShift(DllStructGetData($tTypeDesc, "Val4"), -16), DllStructGetData($tTypeDesc, "Val3"))
                                #forceref $iArrayDescTableOffset
                                $sOut &= "VT_CARRAY" ; <-!!!
                        Case 29 ; VT_USERDEFINED
                                Local $iTypeInfoOffset = BitOR(BitShift(DllStructGetData($tTypeDesc, "Val4"), -16), DllStructGetData($tTypeDesc, "Val3")) ; And with 0xFFFFFFF8 ? (gives wrong)
                                $sOut = " " & _TLB_TypeInfo($iValidTypeInfoOffset, $iValidRefOffset, $iValidGUIDOffset, $iValidNameOffset, $iValidStringOffset, $iValidCustomDataOffset, $pTypeLib, $pSegDesc, $iTypeInfoOffset, True) & $sOut
                EndSwitch
                If $fRet Then Return $sOut & $sData
                $iOffset = $iTypeDescTableOffset
        WEnd
        Return ""
EndFunc   ;==>_TLB_CustomType

Func _TLB_SegDesc($pPointer, $iTable, $fLength = False)
        Local $tSegDesc = DllStructCreate("int Offset;" & _
                        "int Length;" & _
                        "int Reserved1;" & _
                        "int Reserved2;", _
                        $pPointer + ($iTable - 1) * 16)
        If $fLength Then Return DllStructGetData($tSegDesc, "Length")
        Return DllStructGetData($tSegDesc, "Offset")
EndFunc   ;==>_TLB_SegDesc

Func _TLB_Ref($iValidRefOffset, $pPointer, $iOffset)
        If $iOffset < 0 Or $iOffset > $iValidRefOffset Then Return ""
        Local $tRefRecord, $sOut
        For $i = 1 To 10 ; force limit of 10 to avoid possible problems
                $tRefRecord = DllStructCreate("int RefType;" & _
                                "int Flags;" & _
                                "int CustData;" & _
                                "int Next;", _
                                $pPointer + $iOffset)
                $iOffset = DllStructGetData($tRefRecord, "Next")
                If Mod(DllStructGetData($tRefRecord, "RefType"), 4) Then
                        $sOut &= -DllStructGetData($tRefRecord, "RefType") & ";"
                Else
                        $sOut &= DllStructGetData($tRefRecord, "RefType") & ";"
                EndIf
                If $iOffset < 0 Or $iOffset > $iValidRefOffset Then ExitLoop
        Next
        Return StringSplit(StringTrimRight($sOut, 1), ";", 2)
EndFunc   ;==>_TLB_Ref

Func _TLB_CustomData($iValidCustomDataOffset, $pPointer, $iOffset, $fType = False)
        If $iOffset < 0 Or $iOffset > $iValidCustomDataOffset Then Return ""
        Local $tCustom = DllStructCreate("short DataType;" & _
                        "short Value1;" & _
                        "short Value2;", _
                        $pPointer + $iOffset)
        Local $iTye = DllStructGetData($tCustom, "DataType")
        If $fType Then Return $iTye
        If $iTye = 8 Then Return '"' & DllStructGetData(DllStructCreate("char[" & DllStructGetData($tCustom, "Value1") & "]", $pPointer + $iOffset + 6), 1) & '"'
        Return BitOR(BitShift(DllStructGetData($tCustom, "Value2"), -16), DllStructGetData($tCustom, "Value1"))
EndFunc   ;==>_TLB_CustomData

Func _TLB_Name($iValidNameOffset, $pPointer, $iOffset)
        If $iOffset < 0 Or $iOffset > $iValidNameOffset Then Return ""
        Local $tTlbNameModified = DllStructCreate("int RefType;" & _
                        "int NextHash;" & _
                        "byte Length;", _
                        $pPointer + $iOffset)
        Return DllStructGetData(DllStructCreate("char[" & DllStructGetData($tTlbNameModified, "Length") & "]", $pPointer + $iOffset + 12), 1)
EndFunc   ;==>_TLB_Name

Func _TLB_String($iValidStringOffset, $pPointer, $iOffset, $sDefault = "")
        If $iOffset < 0 Or $iOffset > $iValidStringOffset Then Return ""
        Local $tTlbStringModified = DllStructCreate("word Length", $pPointer + $iOffset)
        Return $sDefault & DllStructGetData(DllStructCreate("char[" & DllStructGetData($tTlbStringModified, "Length") & "]", $pPointer + $iOffset + 2), 1)
EndFunc   ;==>_TLB_String

Func _TLB_GUID($iValidGUIDOffset, $pGUID, $iOffset = 0)
        If $iOffset < 0 Or $iOffset > $iValidGUIDOffset Then Return ""
        Local $tGUID = DllStructCreate("dword;word;word;byte[2];byte[6]", $pGUID + $iOffset)
        Return "{" & Hex(DllStructGetData($tGUID, 1), 8) & "-" & Hex(DllStructGetData($tGUID, 2), 4) & "-" & Hex(DllStructGetData($tGUID, 3), 4) & "-" & Hex(DllStructGetData($tGUID, 4)) & "-" & Hex(DllStructGetData($tGUID, 5)) & "}"
EndFunc   ;==>_TLB_GUID

Func _TLB_InterfaceName($sGUID)
        Local $sName
        Switch $sGUID
                Case "{00000000-0000-0000-C000-000000000046}"
                        $sName = "IUnknown"
                Case "{00020400-0000-0000-C000-000000000046}"
                        $sName = "IDispatch"
                Case Else
                        $sName = ""
        EndSwitch
        Return "  " & $sName & "  " & $sGUID
EndFunc   ;==>_TLB_InterfaceName

Func _TLB_GetFlagString($iFlag)
        If $iFlag = 0 Then Return "            "
        Local $sFlag
        If BitAND($iFlag, 1) Then $sFlag &= ",in"
        If BitAND(BitShift($iFlag, 1), 1) Then $sFlag &= ",out"
        If BitAND(BitShift($iFlag, 2), 1) Then $sFlag &= ",LCID"
        If BitAND(BitShift($iFlag, 3), 1) Then $sFlag &= ",retval"
        If BitAND(BitShift($iFlag, 4), 1) Then $sFlag &= ",optional"
        If BitAND(BitShift($iFlag, 5), 1) Then $sFlag &= ",hasdefault"
        If BitAND(BitShift($iFlag, 6), 1) Then $sFlag &= ",hascustom"
        Return "            [" & StringRegExpReplace($sFlag, "\A,(.*?)", "$1") & "]"
EndFunc   ;==>_TLB_GetFlagString

Func _TLB_TypeKind($iKind)
        Local $sKind
        Switch $iKind
                Case 0
                        $sKind = "enum"
                Case 1
                        $sKind = "struct"
                Case 2
                        $sKind = "module"
                Case 3
                        $sKind = "Interface"
                Case 4
                        $sKind = "IDispatch"
                Case 5
                        $sKind = "coclass"
                Case 6
                        $sKind = "alias"
                Case 7
                        $sKind = "union"
                Case 8
                        $sKind = "MAX"
        EndSwitch
        Return $sKind
EndFunc   ;==>_TLB_TypeKind

Func _TLB_CallingConvention($iCallCode)
        Local $sCall
        Switch $iCallCode
                Case 0
                        $sCall = "FASTCALL "
                Case 1
                        $sCall = "CDECL "
                Case 2
                        $sCall = "PASCAL "
                Case 3
                        $sCall = "MACPASCAL "
                Case 4
                        $sCall = "STDCALL "
                Case 5
                        $sCall = "FPFASTCALL "
                Case 6
                        $sCall = "SYSCALL "
                Case 7
                        $sCall = "MPWCDECL "
                Case 8
                        $sCall = "MPWPASCAL "
                Case 9
                        $sCall = "MAX "
        EndSwitch
        Return $sCall
EndFunc   ;==>_TLB_CallingConvention

Func _TLB_InvocationKind($iKind)
        Local $sKind
        Switch $iKind
                Case 1
                        $sKind = "FUNC "
                Case 2
                        $sKind = "PROPERTYGET "
                Case 3
                        $sKind = "PROPERTYPUT "
                Case 4
                        $sKind = "PROPERTYPUTREF "
        EndSwitch
        Return $sKind
EndFunc   ;==>_TLB_InvocationKind

Func _TLB_FuncType($iType)
        Local $sType
        Switch $iType
                Case 0
                        $sType = "VIRTUAL"
                Case 1
                        $sType = "PUREVIRTUAL"
                Case 2
                        $sType = "NONVIRTUAL"
                Case 3
                        $sType = "STATIC"
                Case 4
                        $sType = "DISPATCH"
        EndSwitch
        Return $sType
EndFunc   ;==>_TLB_FuncType

Func _TLB_GetType($iType)
        If $iType = 0 Then Return " none"
        Local $aArrayOfTypes[44][2] = [[0, "none"], _
                        [1, "NULL"], _
                        [2, "short"], _
                        [3, "int"], _
                        [4, "float"], _
                        [5, "double"], _
                        [6, "CY"], _
                        [7, "DATE"], _
                        [8, "BSTR"], _
                        [9, "idispatch"], _
                        [10, "ERROR"], _
                        [11, "bool"], _
                        [12, "VARIANT"], _
                        [13, "IUnknown"], _
                        [14, "DECIMAL"], _
                        [16, "byte"], _
                        [17, "ubyte"], _
                        [18, "word"], _
                        [19, "dword"], _
                        [20, "int64"], _
                        [21, "uint64"], _
                        [22, "int"], _
                        [23, "dword"], _
                        [24, "VOID"], _
                        [25, "HRESULT"], _
                        [26, "ptr"], _
                        [27, "SAFEARRAY"], _
                        [28, "CARRAY"], _
                        [29, "USERDEFINED"], _
                        [30, "str"], _
                        [31, "wstr"], _
                        [36, "RECORD"], _
                        [37, "int_ptr"], _
                        [38, "dword_ptr"], _
                        [64, "FILETIME"], _
                        [65, "BLOB"], _
                        [66, "STREAM"], _
                        [67, "STORAGE"], _
                        [68, "STREAMED_OBJECT"], _
                        [69, "STORED_OBJECT"], _
                        [70, "BLOB_OBJECT"], _
                        [71, "CF"], _
                        [72, "CLSID"], _
                        [73, "VERSIONED_STREAM"]]
        Local $sType, $iStep = -1
        For $i = 43 To 1 Step -1
                If $iType - $aArrayOfTypes[$i][0] >= 0 Then
                        $sType &= " " & $aArrayOfTypes[$i][1] & " |"
                        $iType -= $aArrayOfTypes[$i][0]
                        If $iType = $aArrayOfTypes[$i][0] Then ExitLoop
                        $iStep += 1
                EndIf
        Next
        Return SetExtended($iStep, StringTrimRight($sType, 2))
EndFunc   ;==>_TLB_GetType



; Resource extracting functions...
Func _TLB_FindResourceEx($hModule, $vResType, $vResName, $iResLang = 0)
        Local $sTypeType = "wstr"
        If IsNumber($vResType) Then $sTypeType = "int"
        Local $sNameType = "wstr"
        If IsNumber($vResName) Then $sNameType = "int"
        Local $aCall = DllCall($hKERNEL32, "handle", "FindResourceExW", _
                        "handle", $hModule, _
                        $sTypeType, $vResType, _
                        $sNameType, $vResName, _
                        "int", $iResLang)
        If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
        Return $aCall[0]
EndFunc   ;==>_TLB_FindResourceEx

Func _TLB_SizeofResource($hModule, $hResource)
        Local $aCall = DllCall($hKERNEL32, "int", "SizeofResource", "handle", $hModule, "handle", $hResource)
        If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
        Return $aCall[0]
EndFunc   ;==>_TLB_SizeofResource

Func _TLB_LoadResource($hModule, $hResource)
        Local $aCall = DllCall($hKERNEL32, "handle", "LoadResource", "handle", $hModule, "handle", $hResource)
        If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
        Return $aCall[0]
EndFunc   ;==>_TLB_LoadResource

Func _TLB_LockResource($hResource)
        Local $aCall = DllCall($hKERNEL32, "ptr", "LockResource", "handle", $hResource)
        If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
        Return $aCall[0]
EndFunc   ;==>_TLB_LockResource

Func _TLB_LoadLibraryEx($sModule, $iFlag = 0)
        Local $aCall = DllCall($hKERNEL32, "handle", "LoadLibraryExW", "wstr", $sModule, "handle", 0, "dword", $iFlag)
        If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
        Return $aCall[0]
EndFunc   ;==>_TLB_LoadLibraryEx

Func _TLB_FreeLibrary($hModule)
        Local $aCall = DllCall($hKERNEL32, "bool", "FreeLibrary", "handle", $hModule)
        If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
        Return $aCall[0]
EndFunc   ;==>_TLB_FreeLibrary

Func _TLB_ResourceGetAsRaw($sModule, $vResType, $vResName, $iResLang = 0)
        ; Load the module
        Local $hModule = _TLB_LoadLibraryEx($sModule, 2) ; LOAD_LIBRARY_AS_DATAFILE
        If @error Then Return SetError(1, 0, "")
        ; Find specified resource inside it
        Local $hResource = _TLB_FindResourceEx($hModule, $vResType, $vResName, $iResLang)
        If @error Then
                _TLB_FreeLibrary($hModule)
                Return SetError(2, 0, "")
        EndIf
        ; Determine the size of the resource
        Local $iSizeOfResource = _TLB_SizeofResource($hModule, $hResource)
        If @error Then
                _TLB_FreeLibrary($hModule)
                Return SetError(3, 0, "")
        EndIf
        ; Load it
        $hResource = _TLB_LoadResource($hModule, $hResource)
        If @error Then
                _TLB_FreeLibrary($hModule)
                Return SetError(4, 0, "")
        EndIf
        ; Get pointer
        Local $pResource = _TLB_LockResource($hResource)
        If @error Then
                _TLB_FreeLibrary($hModule)
                Return SetError(5, 0, "")
        EndIf
        ; Make structure at that address
        Local $tBinary = DllStructCreate("byte[" & $iSizeOfResource & "]", $pResource)
        ; Collect data (this should be done before freeing the module)
        Local $bBinary = DllStructGetData($tBinary, 1)
        ; Free
        _TLB_FreeLibrary($hModule)
        ; Return data
        Return $bBinary
EndFunc   ;==>_TLB_ResourceGetAsRaw



; Res enumeration functions
Func _TLB_EnumTypelibs($sModule)
        Local $hModule = _TLB_LoadLibraryEx($sModule, 2) ; LOAD_LIBRARY_AS_DATAFILE
        If @error Then Return SetError(1) ; Couldn't load the module
        Local Static $pEnumResName = DllCallbackGetPtr(DllCallbackRegister("_TLB_EnumResNameProc", "bool", "handle;ptr;ptr;ptr"))
        Local Static $pEnumResLang = DllCallbackGetPtr(DllCallbackRegister("_TLB_EnumResLangProc", "bool", "handle;ptr;ptr;word;ptr"))
        DllCall($hKERNEL32, "bool", "EnumResourceNamesW", _
                        "handle", $hModule, _
                        "wstr", "TYPELIB", _
                        "ptr", $pEnumResName, _ ; pointer to _TLB_EnumResNameProc
                        "ptr", $pEnumResLang) ; passing pointer to _TLB_EnumResLangProc
        _TLB_FreeLibrary($hModule)
EndFunc   ;==>_TLB_EnumTypelibs

Func _TLB_EnumResNameProc($hModule, $pType, $pName, $lParam)
        DllCall($hKERNEL32, "bool", "EnumResourceLanguagesW", _
                        "handle", $hModule, _
                        "ptr", $pType, _
                        "ptr", $pName, _
                        "ptr", $lParam, _ ; pointer to _TLB_EnumResLangProc
                        "int_ptr", 0)
        Return 1
EndFunc   ;==>_TLB_EnumResNameProc

Func _TLB_EnumResLangProc($hModule, $pType, $pName, $iLang, $lParam)
        #forceref $hModule, $pType, $lParam
        Local $vName = Number($pName)
        If $vName > 65535 Then $vName = DllStructGetData(DllStructCreate("wchar[" & _TLB_PtrStringLenW($pName) + 1 & "]", $pName), 1)
        Local $iUbound = UBound($aTypelib)
        ReDim $aTypelib[$iUbound + 1]
        $aTypelib[$iUbound - 1] = $vName & ";" & $iLang
        Return 1
EndFunc   ;==>_TLB_EnumResLangProc



; Additional win messages processing functions...
Func _TLB_WM_SIZE($hWnd, $iMsg, $wParam, $lParam)
        #forceref $iMsg
        Local $aClientSize[2] = [BitAND($lParam, 65535), BitShift($lParam, 16)]
        If $hWnd = $hGUI Then
                Switch $wParam
                        Case 0
                                WinMove($hDots, 0, $aClientSize[0] - 17, $aClientSize[1] - 17)
                                WinSetState($hDots, 0, @SW_RESTORE)
                        Case 2; SIZE_MAXIMIZED
                                WinSetState($hDots, 0, @SW_HIDE)
                EndSwitch
        EndIf
EndFunc   ;==>_TLB_WM_SIZE

Func _TLB_WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
        #forceref $iMsg, $wParam
        If $hWnd = $hGUI Then
                Local $tMINMAXINFO = DllStructCreate("int;int;" & _
                                "int MaxSizeX; int MaxSizeY;" & _
                                "int MaxPositionX;int MaxPositionY;" & _
                                "int MinTrackSizeX; int MinTrackSizeY;" & _
                                "int MaxTrackSizeX; int MaxTrackSizeY", _
                                $lParam)
                DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 325)
                DllStructSetData($tMINMAXINFO, "MinTrackSizeY", 350)
        EndIf
EndFunc   ;==>_TLB_WM_GETMINMAXINFO

Func _TLB_WM_DROPFILES($hWnd, $iMsg, $wParam, $lParam)
        #forceref $iMsg, $lParam
        If $hWnd = $hGUI Then
                $sTLB = _TLB_DragQueryFile($wParam)
                If @error Then
                        _TLB_MessageBeep(48)
                        Return 1
                EndIf
                If StringInStr(FileGetAttrib($sTLB), "D") Then
                        _TLB_MessageBeep(48)
                        $sTLB = ""
                EndIf
                _TLB_DragFinish($wParam)
                Return 1
        EndIf
        _TLB_MessageBeep(48)
        Return 1
EndFunc   ;==>_TLB_WM_DROPFILES



; Misc...
Func _TLB_PtrStringLenW($pString)
        Local $aCall = DllCall($hKERNEL32, "dword", "lstrlenW", "ptr", $pString)
        If @error Then Return SetError(1, 0, 0)
        Return $aCall[0]
EndFunc   ;==>_TLB_PtrStringLenW

Func _TLB_SetErrorMode($iMode)
        Local $aCall = DllCall($hKERNEL32, "dword", "SetErrorMode", "dword", $iMode)
        If @error Then Return SetError(1, 0, 0)
        Return $aCall[0]
EndFunc   ;==>_TLB_SetErrorMode

Func _TLB_MessageBeep($iType)
        DllCall($hUSER32, "int", "MessageBeep", "dword", $iType)
EndFunc   ;==>_TLB_MessageBeep

Func _TLB_DragQueryFile($hDrop, $iIndex = 0)
        Local $aCall = DllCall($hSHELL32, "dword", "DragQueryFileW", _
                        "handle", $hDrop, _
                        "dword", $iIndex, _
                        "wstr", "", _
                        "dword", 32767)
        If @error Or Not $aCall[0] Then Return SetError(1, 0, "")
        Return $aCall[3]
EndFunc   ;==>_TLB_DragQueryFile

Func _TLB_DragFinish($hDrop)
        DllCall($hSHELL32, "none", "DragFinish", "handle", $hDrop)
EndFunc   ;==>_TLB_DragFinish

Func _TLB_CreateDragDots($hGUI)
        Local $aCall = DllCall($hUSER32, "hwnd", "CreateWindowExW", _
                        "dword", 0, _
                        "wstr", "Scrollbar", _
                        "ptr", 0, _
                        "dword", 0x50000018, _ ; $WS_CHILD|$WS_VISIBLE|$SBS_SIZEBOX|$SBS_SIZEBOXOWNERDRAWFIXED
                        "int", 0, _
                        "int", 0, _
                        "int", 17, _ ; Width
                        "int", 17, _ ; Height
                        "hwnd", $hGUI, _
                        "hwnd", 0, _
                        "hwnd", 0, _
                        "int", 0)
        If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
        Return $aCall[0]
EndFunc   ;==>_TLB_CreateDragDots

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 2金钱 +30 贡献 +2 收起 理由
xms77 + 20 + 2 感谢分享!不错的东东
楼上风云 + 10 浩大的工程,不错的作品

查看全部评分

发表于 2012-10-9 22:35:54 | 显示全部楼层
回复 2# lpxx


    好资料,果然是好人
发表于 2012-10-9 23:19:30 | 显示全部楼层
尝试打开.DLL时提示“NO MSFT Type inside this file”.
不知能打开哪类.DLL文件?
发表于 2012-10-9 23:29:50 | 显示全部楼层
回复 2# lpxx


    相当浩大的工程,是原创吗??
发表于 2012-10-10 10:14:09 | 显示全部楼层
本帖最后由 楼上风云 于 2012-10-10 12:30 编辑

回复 4# whitehead

将DLL发来大家帮你看看
貌似是类OCX的DLL可以打开和分析。
发表于 2012-10-10 10:15:10 | 显示全部楼层
本帖最后由 楼上风云 于 2012-10-10 12:31 编辑

回复 2# lpxx

这个不错。要是能完整查出函数里面的参数,那就扛扛了。
是否可能修改为AU3格式 的函数和参数表
发表于 2012-10-10 10:17:03 | 显示全部楼层
回复 1# hello_xiaopeng

光查函数名称本身,工具很多。关键是里面的参数,比较难查出来。
不妨发上来共享一下DLL,也许大家能帮你一起分析。
你说呢?
发表于 2012-10-10 13:12:09 | 显示全部楼层
回复 8# 楼上风云


我也尝试了一把,遇到了同样报错。
使用的dll是commg.dll (下载附件后修改后缀为dll)


来自官网

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2012-10-10 15:44:55 | 显示全部楼层
回复 2# lpxx

谢谢啦 非常好的工具   好好参考一下  努力学习中
发表于 2012-10-10 17:13:29 | 显示全部楼层
本帖最后由 楼上风云 于 2012-10-10 17:17 编辑

回复 9# xiehuahere

commg.au3源码里面已有有相关函数了,如果仅就该DLL本身而言,无须再折腾了。
    但如何解决类似DLL里的函数和参数,倒是需要费心。
  目前好象还没有(或者我还没有找到)很好的工具,轻松地解决函数特别是参数问题,需要用OD等静态和动态的跟踪。
  也许先注册COMMG.DLL然后用工具能识别?有空的时候我再试试。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-10-10 17:20:33 | 显示全部楼层
回复 11# 楼上风云


谢谢!commMG.au3 这个我有的,我上面发的帖子里带官网链接的,我用这个写过串口通信程序。
只是跟你探讨下dll的问题。
发表于 2012-10-10 19:51:01 | 显示全部楼层
回复  whitehead

将DLL发来大家帮你看看
貌似是类OCX的DLL可以打开和分析。
楼上风云 发表于 2012-10-10 10:14

我随便试了WINDOWS目录下的一个DLL貌似结果相同,如附件中的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-10-10 20:00:16 | 显示全部楼层
回复 2# lpxx
感谢分享!不错的东东
发表于 2012-10-11 14:56:18 | 显示全部楼层
能把win平台下的DLL调出并发挥,那就很强大了!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-18 16:50 , Processed in 0.097954 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表