唉,发现ExtractIconToFile.au3函数不支持64位,好遗憾
下面这段,#AutoIt3Wrapper_UseX64=n 就正常,=y 就直接退出,连个错误提示都没有。有高手能改改吗?哈哈#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=test3.exe
;#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include "ExtractIconToFile.au3"
MsgBox(0, 0, _TEST())
Exit
Func _TEST()
If StringInStr(@OSArch, '86') Then
$usek = "HKCU"
Else
$usek = "HKCU64"
EndIf
$USERKEY = $usek & "\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
$sIn = @SystemDir & '\shell32.dll'
$dOt = RegRead($USERKEY, 'Desktop') & '\test.ico'
$index = -15
_ExtractIconToFile($sIn, $index, $dOt)
Return @error
EndFunc ;==>_TEST
本帖最后由 holley 于 2024-5-14 17:37 编辑
我发现路径只有“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders”和“HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders”,,没理解HKCU64的意思- -~
问了一下GPT:
#include <WinAPI.au3>
#include <File.au3>
#include <WinAPIIcons.au3>
MsgBox(0, 0, _TEST())
Exit
Func _TEST()
If StringInStr(@OSArch, '86') Then
$usek = "HKCU"
Else
$usek = "HKCU64"
EndIf
$USERKEY = $usek & "\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
$sIn = @SystemDir & '\shell32.dll'
$dOt = RegRead($USERKEY, 'Desktop') & '\test.ico'
$index = -15
If _TEST_ExtractIconToFile($sIn, $index, $dOt) Then
Return 0 ; No error
Else
Return @error ; Error occurred
EndIf
EndFunc ;==>_TEST
Func _TEST_ExtractIconToFile($sFile, $iIndex, $sDest)
Local $hIcon = _MyExtractIconEx($sFile, $iIndex)
If $hIcon Then
Local $bResult = _MySaveIcon($hIcon, $sDest)
_WinAPI_DestroyIcon($hIcon)
Return $bResult
EndIf
Return SetError(1, 0, False) ; Set an error if the icon could not be extracted.
EndFunc
Func _MyExtractIconEx($sFilePath, $iIndex)
Local $aResult = DllCall('shell32.dll', 'uint', 'ExtractIconExW', 'wstr', $sFilePath, 'int', $iIndex, 'ptr', 0, 'ptr', 0, 'int', 1)
If @error Or Not $aResult Then
Return SetError(@error, 0, 0)
EndIf
Return $aResult
EndFunc
Func _MySaveIcon($hIcon, $sDest)
Local $aIconData = DllCall('user32.dll', 'uint', 'CopyImage', 'ptr', $hIcon, 'uint', 0, 'int', 0, 'int', 0, 'uint', 0)
If @error Or Not $aIconData Then
Return SetError(@error, 0, False)
EndIf
Local $aIconBinary = DllCall('user32.dll', 'uint', 'GetIconInfo', 'ptr', $aIconData)
If @error Or Not $aIconBinary Then
Return SetError(@error, 0, False)
EndIf
Local $hFile = FileOpen($sDest, $FO_OVERWRITE + $FO_CREATEPATH)
If $hFile = -1 Then
Return SetError(1, 0, False)
EndIf
Local $bResult = FileWrite($hFile, $aIconBinary)
FileClose($hFile)
If Not $bResult Then
Return SetError(2, 0, False)
EndIf
Return True
EndFunc
holley 发表于 2024-5-14 17:19
我发现路径只有“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders” ...
哈哈,我一般照抄说明里面的东西。具体含义也不清楚的。
holley 发表于 2024-5-14 17:19
我发现路径只有“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders” ...
这个代码返回错误1,我看了一下,从_MyExtractIconEx函数开始就返回错误,dllcall的返回值是0x00000吧。不太懂。
谢谢老哥,真的感谢。
我的取图标程序用的是官方的函数,也可以到英文官方下载,现在就发现不支持64位,也不知是不是我哪里搞错了:https://www.autoitscript.com/forum/topic/131774-icon-extract/?do=findComment&comment=917786
顽固不化 发表于 2024-5-14 18:56
这个代码返回错误1,我看了一下,从_MyExtractIconEx函数开始就返回错误,dllcall的返回值是0x00000吧。 ...
#NoTrayIcon
#RequireAdmin
#include "ExtractIconToFile.au3"
DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)
FileDelete(@ScriptDir & '\test.ico')
_ExtractIconToFile(@WindowsDir & '\system32\shell32.dll', -15, @ScriptDir & '\test.ico')
ConsoleWrite(@error & @CRLF)
haijie1223 发表于 2024-5-15 22:29
确实,棒棒的。厉害了我的哥 用 _WinAPI_SaveHICONToFile 就行了 afan 发表于 2024-5-16 12:10
用 _WinAPI_SaveHICONToFile 就行了
谢谢大侠,我用户函数消化的还不够,竟然有那么多好用的东东
页:
[1]