顽固不化 发表于 2024-5-14 16:46:11

唉,发现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: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 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


顽固不化 发表于 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/forum/topic/131774-icon-extract/?do=findComment&comment=917786

haijie1223 发表于 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)




顽固不化 发表于 2024-5-15 22:49:22

haijie1223 发表于 2024-5-15 22:29


确实,棒棒的。厉害了我的哥

afan 发表于 2024-5-16 12:10:37

用 _WinAPI_SaveHICONToFile 就行了

顽固不化 发表于 2024-5-16 15:13:54

afan 发表于 2024-5-16 12:10
用 _WinAPI_SaveHICONToFile 就行了

谢谢大侠,我用户函数消化的还不够,竟然有那么多好用的东东
页: [1]
查看完整版本: 唉,发现ExtractIconToFile.au3函数不支持64位,好遗憾