Что нового

Как из PIDL получить URL?

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
У меня есть указатель на PIDL (LPCITEMIDLIST* pointer to an item identifier list (PIDL))
Скорее всего по этому указателю будет URL, типа http://autoit-script.ru/
Как узнать адрес?

Например:
Код:
Local $sUrl = 'http://autoit-script.ru/'
Local $PCIDLIST_ABSOLUT = DllCall("shell32.dll", "ptr", "SHSimpleIDListFromPath", "wstr", $sUrl)
If @error Or Not IsArray($PCIDLIST_ABSOLUT) Then
	Exit
EndIf

ConsoleWrite($PCIDLIST_ABSOLUT[0] & @CRLF)
- указатель есть, а вот как обратно?

Но SHSimpleIDListFromPath уже устарела, подскажите чем заменить?
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
inververs
https://msdn.microsoft.com/en-us/library/windows/desktop/bb773321(v=vs.85).aspx

Если верить MSDN, то эта структура крайне примитивна. Читаете значение cb из SHITemid и затем полученное кол-во байт из массива abID. Точно так же можно создать IDL.


Код:
Global Const $tagSHITEMID = 'align 0; ushort cb; byte abID[1];'

Local $tIDL = SHSimpleIDListFromPath('http://autoit-script.ru/')

ConsoleWrite( SHSimplePathFromIDList(DllStructGetPtr($tIDL)) & @CRLF)

; pIDL = DllStructGetPtr($tIDL)


Func SHSimplePathFromIDList($pIDL)
	Local $tIDL, $tID
	; ---
	$tIDL = DllStructCreate($tagSHITEMID, $pIDL)
	If IsDllStruct($tIDL) And $tIDL.cb Then
		$tID = DllStructCreate('wchar Path[' & $tIDL.cb - 0x02 & ']', DllStructGetPtr($tIDL) + 0x02)

		Return $tID.Path
	EndIf
	; *
	Return ''
EndFunc

Func SHSimpleIDListFromPath($sPath)
	Local $iLen, $tIDL, $tID
	; ---
	$iLen = StringLen($sPath)

	; Документация не требует null-terminated строки
	$tIDL = DllStructCreate($tagSHITEMID & 'byte[' & ($iLen * 2) - 1 & ']')
	$tIDL.cb = DllStructGetSize($tIDL)
	$tID = DllStructCreate('wchar Path[' & $iLen & ']', DllStructGetPtr($tIDL) + 0x02)
	$tID.Path = $sPath
	; *
	Return $tIDL
EndFunc
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Не вышло, какой то у меня не правильный PIDL - PIDLIST_ABSOLUTE
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Зачем вам вообще понадобился PIDL для URL?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Зачем вам вообще понадобился PIDL для URL?
Некоторый объект содержит метод 'GetLocationPidl hresult(ptr*);' ;LPCITEMIDLIST* pidl
Возвращает указатель на IDLIST, из него не вышло получить URL.
 
Верх