找回密码
 加入
搜索
查看: 430|回复: 7

唉,发现ExtractIconToFile.au3函数不支持64位,好遗憾

[复制链接]
发表于 2024-5-14 16:46:11 | 显示全部楼层 |阅读模式
下面这段,#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

本帖子中包含更多资源

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

×
发表于 2024-5-14 17:19:43 | 显示全部楼层
本帖最后由 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[4] Then
        Return SetError(@error, 0, 0)
    EndIf
    Return $aResult[4]
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[0] Then
        Return SetError(@error, 0, False)
    EndIf
    Local $aIconBinary = DllCall('user32.dll', 'uint', 'GetIconInfo', 'ptr', $aIconData[0])
    If @error Or Not $aIconBinary[0] 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[0])
    FileClose($hFile)
    If Not $bResult Then
        Return SetError(2, 0, False)
    EndIf
    Return True
EndFunc

 楼主| 发表于 2024-5-14 17:26:18 | 显示全部楼层
holley 发表于 2024-5-14 17:19
我发现路径只有“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders” ...

哈哈,我一般照抄说明里面的东西。具体含义也不清楚的。





本帖子中包含更多资源

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

×
 楼主| 发表于 2024-5-14 18:56:09 | 显示全部楼层
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/for ... &comment=917786

发表于 2024-5-15 22:29:54 | 显示全部楼层
顽固不化 发表于 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)


本帖子中包含更多资源

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

×

评分

参与人数 1金钱 +50 收起 理由
顽固不化 + 50 很给力!

查看全部评分

 楼主| 发表于 2024-5-15 22:49:22 | 显示全部楼层

确实,棒棒的。厉害了我的哥
发表于 2024-5-16 12:10:37 | 显示全部楼层
用 _WinAPI_SaveHICONToFile 就行了
 楼主| 发表于 2024-5-16 15:13:54 | 显示全部楼层
afan 发表于 2024-5-16 12:10
用 _WinAPI_SaveHICONToFile 就行了

谢谢大侠,我用户函数消化的还不够,竟然有那么多好用的东东
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-26 09:24 , Processed in 0.096679 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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