SONIDOS EN DLL?

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
alexis
Aprendiz de Mago
Mensajes: 32
Registrado: 31 Jul 2015, 22:57

SONIDOS EN DLL?

Mensaje por alexis »

HOLAS, BUENOS DÍAS.

SE ME OCURRIÓ ALGO, Y NO SÉ SI SERÁ POSIBLE.

se puede crear un scrips que reproduzca un sonido contenido en un dll?
como por ejemplo el sonido de inicio de windows?
esos sonidos se guardan en wav.

desde ya muchas gracias,

saludos :)
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: SONIDOS EN DLL?

Mensaje por Dany »

De Seguro se puede. pero porque los quieres meter en una dll?

Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
alexis
Aprendiz de Mago
Mensajes: 32
Registrado: 31 Jul 2015, 22:57

Re: SONIDOS EN DLL?

Mensaje por alexis »

me daba curiocidad, y para meter varios archivos en uno solo :)
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: SONIDOS EN DLL?

Mensaje por chekok »

En un ejecutable de autoit también puedes incrustar varios archivos, ya sean sonidos, imagenes, otros ejecutables, dlls, etc. Es algo que suelo utilizar muy habitualmente.
La vida es larga y dura.
alexis
Aprendiz de Mago
Mensajes: 32
Registrado: 31 Jul 2015, 22:57

Re: SONIDOS EN DLL?

Mensaje por alexis »

y como se llaman a los sonidos o imágenes o ejecutables desde el código?
todo se extrae en una ubicación temporal y los llamo como si estuviesen en la misma carpeta que el ejecutable?
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: SONIDOS EN DLL?

Mensaje por Dany »

Para reproducir un sonido usas la función SoundPlay pasandole como primer parametro la ruta del archivo mp3 o wav. y segundo parametro (opcional.) sino lo colocas por default es 0. lo que hace referencia a que tu script no se pausa. si colocas 1 tu script se pausa hasta que deje de sonar to archivo.

Para hacer lo que quieres también es posible. lo de colocar varios archivos de musica en una librería o otro tipo de archivo. pero es mas tedioso.

Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
alexis
Aprendiz de Mago
Mensajes: 32
Registrado: 31 Jul 2015, 22:57

Re: SONIDOS EN DLL?

Mensaje por alexis »

OKY, comprendo :)

muchas gracias por sus respuestas :)

saludos :)
qpongo
Hacker del Foro
Mensajes: 110
Registrado: 10 Abr 2013, 15:53
Ubicación: Madrid

Re: SONIDOS EN DLL?

Mensaje por qpongo »

Una pregunta sobre esto
Usando Soundplay ¿podemos poner como dirección del archivo un http://. ..... que por ejemplo vaya a mis archivos de sonido grabados en Dropbox y así tener los siempre disponibles?

Gracias!!
qpongo
Hacker del Foro
Mensajes: 110
Registrado: 10 Abr 2013, 15:53
Ubicación: Madrid

Re: SONIDOS EN DLL?

Mensaje por qpongo »

Me auto respondo la pregunta :-)

Código: Seleccionar todo

SoundPlay("https://dl.dropboxusercontent.com/u/8479533/automaticochicasRitmoAutom%C3%A1tico.mp3",1)
:smt006 ¿Os funciona el sonido?
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: SONIDOS EN DLL?

Mensaje por chekok »

Para meter varios archivos de sonido en un solo archivo exe de autoit lo debes hacer de la siguiente manera:

Código: Seleccionar todo

;Con estas líneas cargamos los sonidos al exe cuando lo compilamos. (deben estar en la misma carpeta los ficheros .mp3 y el .au3)
#AutoIt3Wrapper_Res_File_Add=sonido1.mp3, rt_rcdata, sonido1
#AutoIt3Wrapper_Res_File_Add=sonido2.mp3, rt_rcdata, sonido2
#AutoIt3Wrapper_Res_File_Add=sonido3.mp3, rt_rcdata, sonido3
#AutoIt3Wrapper_Res_File_Add=sonido4.mp3, rt_rcdata, sonido4

#include "resources.au3"
#include <File.au3>

; Con esto sacamos del exe los archivos de sonido cuando ejecutamos el exe, puedes programarlo de otra manera si lo quieres hacer al pulsar un botón, etc. Se extraen en la misma ubicación donde está el archivo .exe (También puedes especificar una ruta distinta directamente).
_ResourceSaveToFile("sonido1.mp3", "sonido1", $RT_RCDATA, 0, 1)
_ResourceSaveToFile("sonido2.mp3", "sonido2", $RT_RCDATA, 0, 1)
_ResourceSaveToFile("sonido3.mp3", "sonido3", $RT_RCDATA, 0, 1)
_ResourceSaveToFile("sonido4.mp3", "sonido4", $RT_RCDATA, 0, 1)

;En caso de que queramos moverlos a otra ubicación, este sería un ejemplo fácil...
FileCopy("sonido1.mp3",@SystemDir & "\mis_sonidos\sonido1.mp3",1)

Como ves es bastante sencillo, esto es válido para cualquier clase de archivos, ya sean imágenes, sonidos, otros exes, dlls, etc...

Si te fijas en el código, te hace falta un archivo llamado "resources.au3" en el include. Si no encuentras el archivo, te pongo aquí abajo el código del mismo.

resources.au3

Código: Seleccionar todo

#include-once
#include <Constants.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <Memory.au3>

_GDIPlus_Startup()

Global Const $RT_CURSOR = 1
Global Const $RT_BITMAP = 2
Global Const $RT_ICON = 3
Global Const $RT_MENU = 4
Global Const $RT_DIALOG = 5
Global Const $RT_STRING = 6
Global Const $RT_FONTDIR = 7
Global Const $RT_FONT = 8
Global Const $RT_ACCELERATOR = 9
Global Const $RT_RCDATA = 10
Global Const $RT_MESSAGETABLE = 11
Global Const $RT_GROUP_CURSOR = 12
Global Const $RT_GROUP_ICON = 14
Global Const $RT_VERSION = 16
Global Const $RT_DLGINCLUDE = 17
Global Const $RT_PLUGPLAY = 19
Global Const $RT_VXD = 20
Global Const $RT_ANICURSOR = 21
Global Const $RT_ANIICON = 22
Global Const $RT_HTML = 23
Global Const $RT_MANIFEST = 24

Global Const $SND_RESOURCE = 0x00040004
Global Const $SND_SYNC = 0x0
Global Const $SND_ASYNC = 0x1
Global Const $SND_MEMORY = 0x4
Global Const $SND_LOOP = 0x8
Global Const $SND_NOSTOP = 0x10
Global Const $SND_NOWAIT = 0x2000
Global Const $SND_PURGE = 0x40

Func _ResourceGet($ResName, $ResType = 10, $ResLang = 0, $DLL = -1) ; $RT_RCDATA = 10
	Local Const $IMAGE_BITMAP = 0
	Local $hInstance, $hBitmap, $InfoBlock, $GlobalMemoryBlock, $MemoryPointer, $ResSize

	If $DLL = -1 Then
	  $hInstance = _WinAPI_GetModuleHandle("")
	Else
	  $hInstance = _WinAPI_LoadLibraryEx($DLL, $LOAD_LIBRARY_AS_DATAFILE)
	EndIf
	If $hInstance = 0 Then Return SetError(1, 0, 0)

	If $ResType = $RT_BITMAP Then
		$hBitmap = _WinAPI_LoadImage($hInstance, $ResName, $IMAGE_BITMAP, 0, 0, 0)
		If @error Then Return SetError(2, 0, 0)
		Return $hBitmap ; returns handle to Bitmap
	EndIf

	If $ResLang <> 0 Then
		$InfoBlock = DllCall("kernel32.dll", "ptr", "FindResourceExW", "ptr", $hInstance, "long", $ResType, "wstr", $ResName, "short", $ResLang)
	Else
		$InfoBlock = DllCall("kernel32.dll", "ptr", "FindResourceW", "ptr", $hInstance, "wstr", $ResName, "long", $ResType)
	EndIf

	If @error Then Return SetError(3, 0, 0)
	$InfoBlock = $InfoBlock[0]
	If $InfoBlock = 0 Then Return SetError(4, 0, 0)

	$ResSize = DllCall("kernel32.dll", "dword", "SizeofResource", "ptr", $hInstance, "ptr", $InfoBlock)
	If @error Then Return SetError(5, 0, 0)
	$ResSize = $ResSize[0]
	If $ResSize = 0 Then Return SetError(6, 0, 0)

	$GlobalMemoryBlock = DllCall("kernel32.dll", "ptr", "LoadResource", "ptr", $hInstance, "ptr", $InfoBlock)
	If @error Then Return SetError(7, 0, 0)
	$GlobalMemoryBlock = $GlobalMemoryBlock[0]
	If $GlobalMemoryBlock = 0 Then Return SetError(8, 0, 0)

	$MemoryPointer = DllCall("kernel32.dll", "ptr", "LockResource", "ptr", $GlobalMemoryBlock)
	If @error Then Return SetError(9, 0, 0)
	$MemoryPointer = $MemoryPointer[0]
	If $MemoryPointer = 0 Then Return SetError(10, 0, 0)

	If $DLL <> -1 Then _WinAPI_FreeLibrary($hInstance)
	If @error Then Return SetError(11, 0, 0)

	SetExtended($ResSize)
	Return $MemoryPointer
EndFunc

; for ANSI strings
Func _ResourceGetAsString($ResName, $ResType = 10, $ResLang = 0, $DLL = -1) ; $RT_RCDATA = 10
	Local $ResPointer, $ResSize, $struct

	$ResPointer = _ResourceGet($ResName, $ResType, $ResLang, $DLL)
	If @error Then
		SetError(1, 0, 0)
		Return ''
	EndIf
	$ResSize = @extended
	$struct = DllStructCreate("char[" & $ResSize & "]", $ResPointer)
	Return DllStructGetData($struct, 1) ; returns string
EndFunc

; for Unicode strings (Widechar)
Func _ResourceGetAsStringW($ResName, $ResType = 10, $ResLang = 0, $DLL = -1) ; $RT_RCDATA = 10
    Local $ResPointer, $ResSize, $struct

    $ResPointer = _ResourceGet($ResName, $ResType, $ResLang, $DLL)
    If @error Then
        SetError(1, 0, 0)
        Return ''
    EndIf
    $ResSize = @extended
    $struct = DllStructCreate("wchar[" & $ResSize & "]", $ResPointer)
    Return DllStructGetData($struct, 1) ; returns string
EndFunc

; _ResourceGetAsBytes() doesn't work for RT_BITMAP type
; because _ResourceGet() returns hBitmap instead of memory pointer in this case
Func _ResourceGetAsBytes($ResName, $ResType = 10, $ResLang = 0, $DLL = -1) ; $RT_RCDATA = 10
	Local $ResPointer, $ResSize

	$ResPointer = _ResourceGet($ResName, $ResType, $ResLang, $DLL)
	If @error Then Return SetError(1, 0, 0)
	$ResSize = @extended
	Return DllStructCreate("byte[" & $ResSize & "]", $ResPointer) ; returns struct with bytes
EndFunc

; returned hImage can be used in many GDI+ functions:
; $width =  _GDIPlus_ImageGetWidth ($hImage)
; $height = _GDIPlus_ImageGetHeight($hImage)
Func _ResourceGetAsImage($ResName, $ResType = 10, $DLL = -1) ; $RT_RCDATA = 10
	Local $ResData, $nSize, $hData, $pData, $pStream, $pBitmap, $hBitmap

	$ResData = _ResourceGet($ResName, $ResType, 0, $DLL)
	If @error Then Return SetError(1, 0, 0)
	$nSize = @extended

	If $ResType = $RT_BITMAP Then
 		; $ResData is hBitmap type
		$hImage = _GDIPlus_BitmapCreateFromHBITMAP($ResData)
	Else
 		; $ResData is memory pointer
		; thanks ProgAndy
		$hData = _MemGlobalAlloc($nSize,2)
		$pData = _MemGlobalLock($hData)
		_MemMoveMemory($ResData,$pData,$nSize)
		_MemGlobalUnlock($hData)
		$pStream = DllCall( "ole32.dll","int","CreateStreamOnHGlobal", "ptr",$hData, "int",1, "ptr*",0)
		$pStream = $pStream[3]
		;$hImage = DllCall($ghGDIPDll,"int","GdipCreateBitmapFromStream", "ptr",$pStream, "ptr*",0)
		$hImage = $hImage[2]
		_WinAPI_DeleteObject($pStream)
		; next line must be commented otherwise animated GIFs will not work
;~ 		_MemGlobalFree($hData)
	EndIf

	Return $hImage ; hImage type
EndFunc

Func _ResourceGetAsBitmap($ResName, $ResType = 10, $DLL = -1) ; $RT_RCDATA = 10
	$hImage = _ResourceGetAsImage($ResName, $ResType, $DLL)
	If @error Then Return SetError(1, 0, 0)
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
	Return $hBitmap ; hBitmap type
EndFunc

Func _ResourceSaveToFile($FileName, $ResName, $ResType = 10, $ResLang = 0, $CreatePath = 0, $DLL = -1) ; $RT_RCDATA = 10
	Local $ResStruct, $ResSize, $FileHandle

	If $CreatePath Then $CreatePath = 8 ; mode 8 = Create directory structure if it doesn't exist in FileOpen()

	If $ResType = $RT_BITMAP Then
		; workaround: for RT_BITMAP _ResourceGetAsBytes() doesn't work so use _ResourceGetAsImage()
		$hImage = _ResourceGetAsImage($ResName, $ResType)
		If @error Then Return SetError(10, 0, 0)

		; create filepath if doesn't exist
		$FileHandle = FileOpen($FileName, 2+16+$CreatePath)
		If @error Then Return SetError(11, 0, 0)
		FileClose($FileHandle)
		If @error Then Return SetError(12, 0, 0)

		_GDIPlus_ImageSaveToFile($hImage, $FileName)
		_GDIPlus_ImageDispose($hImage)

		$ResSize = FileGetSize($FileName)
	Else
		; standard way
		$ResStruct = _ResourceGetAsBytes($ResName, $ResType, $ResLang, $DLL)
		If @error Then Return SetError(1, 0, 0)
		$ResSize = DllStructGetSize($ResStruct)

		$FileHandle = FileOpen($FileName, 2+16+$CreatePath)
		If @error Then Return SetError(2, 0, 0)
		FileWrite($FileHandle, DllStructGetData($ResStruct, 1))
		If @error Then Return SetError(3, 0, 0)
		FileClose($FileHandle)
		If @error Then Return SetError(4, 0, 0)
	EndIf

	Return $ResSize
EndFunc

Func _ResourceSetImageToCtrl($CtrlId, $ResName, $ResType = 10, $DLL = -1) ; $RT_RCDATA = 10
	Local $ResData, $nSize, $hData, $pData, $pStream, $pBitmap, $hBitmap

	$ResData = _ResourceGet($ResName, $ResType, 0, $DLL)
	If @error Then Return SetError(1, 0, 0)
	$nSize = @extended

	If $ResType = $RT_BITMAP Then
		_SetBitmapToCtrl($CtrlId, $ResData)
		If @error Then Return SetError(2, 0, 0)
	Else
		; thanks ProgAndy
		; for other types than BITMAP use GDI+ for converting to bitmap first
		$hData = _MemGlobalAlloc($nSize,2)
		$pData = _MemGlobalLock($hData)
		_MemMoveMemory($ResData,$pData,$nSize)
		_MemGlobalUnlock($hData)
		$pStream = DllCall( "ole32.dll","int","CreateStreamOnHGlobal", "ptr",$hData, "int",1, "ptr*",0)
		$pStream = $pStream[3]
		;$pBitmap = DllCall($ghGDIPDll,"int","GdipCreateBitmapFromStream", "ptr",$pStream, "ptr*",0)
		$pBitmap = $pBitmap[2]
		$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($pBitmap)
		_SetBitmapToCtrl($CtrlId, $hBitmap)
		If @error Then SetError(3, 0, 0)
		_GDIPlus_BitmapDispose($pBitmap)
		_WinAPI_DeleteObject($pStream)
		_MemGlobalFree($hData)
	EndIf

	Return 1
EndFunc

; internal helper function
; thanks for improvements Melba
Func _SetBitmapToCtrl($CtrlId, $hBitmap)
    Local Const $STM_SETIMAGE = 0x0172
    Local Const $STM_GETIMAGE = 0x0173
    Local Const $BM_SETIMAGE = 0xF7
    Local Const $BM_GETIMAGE = 0xF6
    Local Const $IMAGE_BITMAP = 0
    Local Const $SS_BITMAP = 0x0E
    Local Const $BS_BITMAP = 0x0080
    Local Const $GWL_STYLE = -16

    Local $hWnd, $hPrev, $Style, $iCtrl_SETIMAGE, $iCtrl_GETIMAGE, $iCtrl_BITMAP

    $hWnd = GUICtrlGetHandle($CtrlId)
    If $hWnd = 0 Then Return SetError(1, 0, 0)

    $CtrlId = _WinAPI_GetDlgCtrlID($hWnd) ; support for $CtrlId = -1
    If @error Then Return SetError(2, 0, 0)

    ; determine control class and adjust constants accordingly
    Switch _WinAPI_GetClassName($CtrlId)
        Case "Button" ; button,checkbox,radiobutton,groupbox
            $iCtrl_SETIMAGE = $BM_SETIMAGE
            $iCtrl_GETIMAGE = $BM_GETIMAGE
            $iCtrl_BITMAP = $BS_BITMAP
        Case "Static" ; picture,icon,label
            $iCtrl_SETIMAGE = $STM_SETIMAGE
            $iCtrl_GETIMAGE = $STM_GETIMAGE
            $iCtrl_BITMAP = $SS_BITMAP
        Case Else
            Return SetError(3, 0, 0)
	EndSwitch

	; set SS_BITMAP/BS_BITMAP style to the control
    $Style = _WinAPI_GetWindowLong($hWnd, $GWL_STYLE)
    If @error Then Return SetError(4, 0, 0)
    _WinAPI_SetWindowLong($hWnd, $GWL_STYLE, BitOR($Style, $iCtrl_BITMAP))
    If @error Then Return SetError(5, 0, 0)

	; set image to the control
    $hPrev  = _SendMessage($hWnd, $iCtrl_SETIMAGE, $IMAGE_BITMAP, $hBitmap)
    If @error Then Return SetError(6, 0, 0)
    If $hPrev Then _WinAPI_DeleteObject($hPrev)

	Return 1
EndFunc

; thanks Larry,ProgAndy
; MSDN: http://msdn2.microsoft.com/en-us/library/ms712879.aspx
; default flag is $SND_SYNC = 0
Func _ResourcePlaySound($ResName, $Flag = 0, $DLL = -1)
	If $DLL = -1 Then
	  $hInstance = 0
	Else
	  $hInstance = _WinAPI_LoadLibraryEx($DLL, $LOAD_LIBRARY_AS_DATAFILE)
	EndIf

	Local $ret = DllCall("winmm.dll", "int", "PlaySound", "str", $ResName, "hwnd", $hInstance, "int", BitOr($SND_RESOURCE,$Flag))
	If @error Then Return SetError(1, 0, 0)

	If $DLL <> -1 Then _WinAPI_FreeLibrary($hInstance)
	If @error Then Return SetError(2, 0, 0)

	Return $ret[0]
EndFunc

Espero que te sirva. Un saludo.
La vida es larga y dura.
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: SONIDOS EN DLL?

Mensaje por Dany »

@qpongo cuando dura el mp3?

Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
qpongo
Hacker del Foro
Mensajes: 110
Registrado: 10 Abr 2013, 15:53
Ubicación: Madrid

Re: SONIDOS EN DLL?

Mensaje por qpongo »

@Dany 2 segundos como mucho ¿porque lo preguntas?

qpongo
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: SONIDOS EN DLL?

Mensaje por Dany »

Me suena :)
SoundPlay("http://www.freesfx.co.uk/rx2/mp3s/10/12 ... 511.mp3",1)
escucha esa 27 segundos.

Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
qpongo
Hacker del Foro
Mensajes: 110
Registrado: 10 Abr 2013, 15:53
Ubicación: Madrid

Re: SONIDOS EN DLL?

Mensaje por qpongo »

Un piano precioso @Dany :smt001

qpongo
:smt102
Responder