【已解决】关于获取DLL内部图标数量
本帖最后由 chenronting 于 2011-1-22 20:01 编辑上面那个函数是用来选择ICO图标的,现在想请教一个问题:
不知道能不能得到Dll的内部图标数量?
在论坛里搜索了下没有发现这方面的东西
希望知道的能来回答到, 谢谢{:face (316):}
谢谢下面几位回答者。{:face (316):}
最完美的答案在 9#, 参考下这段代码:
Func _ChooseIcon($sDll_File = "\shell32.dll")
$sDll_File = @SystemDir & $sDll_File
If Not FileExists($sDll_File) Then
SetError(1)
Return -1
EndIf
Local $sscInt = DllStructCreate("int")
Local $sscString = DllStructCreate("wchar")
Local $sstructsize = DllStructGetSize($sscString) / 2
DllStructSetData($sscString, 1, $sDll_File)
DllCall("shell32.dll", "none", 62, "hwnd", 0, "ptr", DllStructGetPtr($sscString), "int", $sstructsize, "ptr", DllStructGetPtr($sscInt))
If @error Then
SetError(2)
Return -1
EndIf
Local $nIconIndex = DllStructGetData($sscInt, 1)
If @error <> 0 Then
SetError(3)
Return -1
EndIf
Return $nIconIndex
EndFunc ;==>_ChooseIcon
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
Global $iIconIndex
; Example:
$iIconIndex = _ChooseIcon("\shell32.dll") ; Loads the DLL file: [@SystemDir]\shell32.dll
MsgBox(64, "_ChooseIcon Example", "Icon ID: " & $iIconIndex) 不错 学习了。。。。 回复 2# smartzbs
这个还真看不太懂,不知道在这里面如何得到数量?帮助我吧。谢谢 把标题改了就告诉你。 有个笨办法:
#Include <WinAPI.au3>
$sIcon = @SystemDir & '\shell32.dll'
$iIndex = 0
While 1
$Ret = DllCall('shell32.dll', 'int', 'SHExtractIconsW', 'wstr', $sIcon, 'int', $iIndex, 'int', 0, 'int', 0, 'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)
If (@error) Or ($Ret = 0) Or ($Ret = Ptr(0)) Then
;$iIndex -= 1
ExitLoop
EndIf
_WinAPI_DestroyIcon($Ret)
$iIndex += 1
WEnd
ConsoleWrite("总数:"&$iIndex&",范围:0-"&$iIndex-1&@CRLF) 不针对问题,只针对上一楼的代码,改为折半效率高.
Local $aNum, $sIcon, $t
$sIcon = @SystemDir & '\shell32.dll'
$aNum = 0
$aNum = 0xffffff ; $iIndex: int type
$aNum = Ceiling(($aNum+$aNum)/2)
$t=TimerInit()
While 1
$Ret = DllCall('shell32.dll', 'int', 'SHExtractIconsW', 'wstr', $sIcon, 'int', $aNum, 'int', 0, 'int', 0, 'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)
If (@error) Or ($Ret = 0) Or ($Ret = Ptr(0)) Then
$aNum = _TwoValue($aNum, False)
Else
DllCall("user32.dll", "bool", "DestroyIcon", "handle", $Ret);_WinAPI_DestroyIcon($Ret)
$aNum = _TwoValue($aNum, True)
EndIf
If $aNum Then ExitLoop
WEnd;
$t=TimerDiff($t)
If IsNumber($aNum) Then
ConsoleWrite("总数:" & $aNum-$aNum+1 & ",范围:" & $aNum & "-" & $aNum & ",用时" & $t &@CRLF)
Else
ConsoleWrite("没有Icon" & @CRLF)
EndIf
Func _TwoValue($aNum, $bCon = True)
Select
Case $bCon;中值结果为True
If Not IsNumber($aNum) Then $aNum=$aNum;记录最小有效
If $aNum = $aNum Then
$aNum = $aNum;结束,成功,$aNum IsNumber
$aNum = True
Return $aNum
EndIf
$aNum = $aNum;记录当前最小
Case Else
If $aNum = $aNum Then
$aNum = True;结束,全没有,$aNum Not IsNumber
Return $aNum
EndIf
If $aNum = $aNum Then
$aNum = $aNum
Else
$aNum = $aNum;记录当前最大
EndIf
EndSelect
$aNum = Ceiling(($aNum+$aNum)/2)
Return $aNum
EndFunc
回复 7# 阿福
使用是的测试法?呵呵, 感谢回答 回复 6# smartzbs
使用是的测试法?呵呵, 感谢回答 本帖最后由 pusofalse 于 2011-1-21 20:58 编辑
$iTotalNumber = DllCall("Shell32.dll", "long", "ExtractIcon", "ptr", 0, "str", "Shell32.dll", "int", -1)
MsgBox(0, "", $iTotalNumber) 回复 10# pusofalse
感谢P版的帮助 。呵呵, 同样感谢前面两位童鞋。。。{:face (88):}
页:
[1]