SHChangeIconDialog

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
fallen
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 06.04.2003 (Вс) 22:06

SHChangeIconDialog

Сообщение fallen » 24.02.2005 (Чт) 13:51

есть такая недокументированная функция SHChangeIconDialog.
может кто знает как из нее пользу извлечь? т.е. по прямому назначению использовать, а то она не возвращает ни файл, ни номер иконки

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 24.02.2005 (Чт) 14:11

Вроде-бы все возвращает, так объявляется:
Код: Выделить всё
Private Declare Function SHChangeIconDialog Lib "Shell32" Alias "#62" (ByVal hOwner As Long, ByVal szFilename As String, Reserved As Long, lpIconIndex As Long) As Long


Параметры
hOwner - хэндл родителя.
sFileName - полный путь файла с иконками (должен существовать). Если в указанном файле нет иконок, вызываются иконки Shell32.dll. sFileName должен быть максимальной длинны, например, так sFileName = sFileName & String$(260 - Len(sFileName), 0)
nBuf - буфер для имени файла, если имя максимальной длины, то можно передавать 0, если нет - максимальный размер
nIconIndex - до выполнения - 0, после выполнения функции возвращает номер иконки в файле. Далее эту иконку можно вытащить с помощью вполне документированной функции ExtractIconEx из той же библиотеки.

Вообще слышал такое, что не под всеми виндами, но под 98 - все ОК

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.02.2005 (Чт) 15:37

Под всеми, только под Win2000 длину надо передавать явно (0 не катит).
Изображение

fallen
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 06.04.2003 (Вс) 22:06

Сообщение fallen » 24.02.2005 (Чт) 17:27

2tyomich: объясни поподробнее.

в общем этот код из API-Guide:
Код: Выделить всё
Private Const VER_PLATFORM_WIN32_NT = 2
Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long
Private Declare Function SHChangeIconDialogA Lib "shell32" Alias "#62" (ByVal hOwner As Long, ByVal szFilename As String, ByVal Reserved As Long, lpIconIndex As Long) As Long
Private Declare Function SHChangeIconDialogW Lib "shell32" Alias "#62" (ByVal hOwner As Long, ByVal szFilename As Long, ByVal Reserved As Long, lpIconIndex As Long) As Long
'Detect if the program is running under Windows NT
Public Function IsWinNT() As Boolean
    Dim myOS As OSVERSIONINFO
    myOS.dwOSVersionInfoSize = Len(myOS)
    GetVersionEx myOS
    IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT)
End Function
Public Function chooseIcon(ByRef strFile As String, ByRef lngIconNum As Long) As Boolean
    Dim str1 As String * 260
    Dim lng1 As Long ' Dummy?
    Dim lngResult As Long
    str1 = strFile & vbNullChar
    'is this code executed under WinNT?
    If IsWinNT Then
        'if we're in WinNT, we have to call the Unicode version of the function
        lngResult = SHChangeIconDialogW(Me.hWnd, StrPtr(str1), lng1, lngIconNum)
    Else
        'if we're in Win9x, we have to call the ANSI version of the function
        lngResult = SHChangeIconDialogA(Me.hWnd, str1, lng1, lngIconNum)
    End If
    'The function itself returns 0 (failed) or 1 (success)
    'str1 is adapted to the selected filename
    chooseIcon = (lngResult <> 0)
    If chooseIcon Then
        strFile = Left$(str1, InStr(1, str1, vbNullChar, vbBinaryCompare) - 1)
    End If
End Function
Private Sub Form_Load()
   
    Dim IconFile As String
    Dim IconIndex As Long
    IconFile = "shell32.dll"
    IconIndex = 0
    chooseIcon IconFile, IconIndex
    Me.AutoRedraw = True
    Me.Print IconFile & "," & IconIndex
End Sub


под XP номер иконки возвращается, а вот имя файла (это если нажать обзор и выбрать другой файл) - нет

под 98 все работает нормально

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.02.2005 (Чт) 18:09

Ну сколько же раз можно на один и тот же вопрос отвечать? :-)
http://bbs.vbstreets.ru/viewtopic.php?p=87493#87493
Изображение

fallen
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 06.04.2003 (Вс) 22:06

Сообщение fallen » 24.02.2005 (Чт) 21:16

хм. странно вроде искал по форуму, как раз по "SHChangeIconDialog" и не нашел ничего...
что ж, спасибо...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Majestic-12 [Bot], Yandex-бот и гости: 99

    TopList