Ayuda con DllStructCreate y DllStructGetData

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
mcr_bkn
Mensajes: 19
Registrado: 01 Abr 2013, 18:29

Ayuda con DllStructCreate y DllStructGetData

Mensaje por mcr_bkn »

Estimados amigos del foro, tengo unas dudas respecto al asunto, a ver si alguien amable me puede aclarar algunos conceptos y aterrizarlos. En la ayuda salen los siguientes ejemplos:


Ejemplo 1 para DllStructCreate:

Código: Seleccionar todo

;   Crea la estructura
;   struct {
;       int             var1;
;       unsigned char   var2;
;       unsigned int    var3;
;       char            var4[128];
;   }
;=========================================================
$str        = "int var1;ubyte var2;uint var3;char var4[128]"
$a          = DllStructCreate($str)
if @error Then
    MsgBox(0,"","Error in DllStructCreate " & @error);
    exit
endif

;=========================================================
;   Establece datos en la estructura
;   struct.var1 = -1;
;   struct.var2 = 255;
;   struct.var3 = INT_MAX; -1 will be typecasted to (unsigned int)
;   strcpy(struct.var4,"Hola");
;   struct.var4[0]  = 'h';
;=========================================================
DllStructSetData($a,"var1",-1)
DllStructSetData($a,"var2",255)
DllStructSetData($a,"var3",-1)
DllStructSetData($a,"var4","Hola")
DllStructSetData($a,"var4",Asc("h"),1)

;=========================================================
;   Mostrando la información de la estructura
;=========================================================
MsgBox(0,"DllStruct","Tamaño de estructura: " & DllStructGetSize($a) & @CRLF & _
        "Puntero de estructura: " & DllStructGetPtr($a) & @CRLF & _
        "Dato:" & @CRLF & _
        DllStructGetData($a,1) & @CRLF & _
        DllStructGetData($a,2) & @CRLF & _
        DllStructGetData($a,3) & @CRLF & _
        DllStructGetData($a,4))
		msgbox(0,"prueba", $a)

;~ MsgBox(0,"DllStruct","Tamaño de estructura: " & DllStructGetSize($a) & "Puntero de estructura: " & DllStructGetPtr($a) & "Dato:" DllStructGetData($a,1) & @CRLF & _
;~        DllStructGetData($a,2) & @CRLF & _
;~         DllStructGetData($a,3) & @CRLF & _
;~         DllStructGetData($a,4))

;=========================================================
;   Liberando memoria asignada a la estructura
;=========================================================
$a=0
Ejemplo 2 para DllStructGetData:

Código: Seleccionar todo

$p  = DllStructCreate("dword dwOSVersionInfoSize;dword dwMajorVersion;dword dwMinorVersion;dword dwBuildNumber;dword dwPlatformId;char szCSDVersion[128]")

;Pensar en esto como p->dwOSVersionInfoSize = sizeof(OSVERSIONINFO)
DllStructSetData($p, "dwOSVersionInfoSize", DllStructGetSize($p))

;haciendo el  DllCall
$ret = DllCall("kernel32.dll","int","GetVersionEx","ptr",DllStructGetPtr($p))

if Not $ret[0] Then
    MsgBox(0,"DllCall Error","DllCall Failed")
    exit
EndIf

;obtener los valore de retorno
$major      = DllStructGetData($p,"dwMajorVersion")
$minor      = DllStructGetData($p,"dwMinorVersion")
$build      = DllStructGetData($p,"dwBuildNumber")
$platform   = DllStructGetData($p,"dwPlatformId")
$version    = DllStructGetData($p,"szCSDVersion")

;liberando la estructura
$p =0

msgbox(0,"","Mayor: " & $major & @CRLF & _
            "Menor: " & $minor & @CRLF & _
            "Build: " & $build & @CRLF & _
            "ID plataforma: " & $platform & @CRLF & _
            "Versión: " & $version)
Para crear hay parametros como: dword, char, etc. DllStructCreate debe tener una estructura?? y para llamar con DllStructGetData, bueno a ver si me pueden explicar un poco y aterrizar un poco los conceptos.

Muchas gracias de ante mano....

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

Re: Ayuda con DllStructCreate y DllStructGetData

Mensaje por Dany »

Y la duda es?
  • ............................................Imagen
    ......................................Imagen
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Ayuda con DllStructCreate y DllStructGetData

Mensaje por Dany »

simplemente crear una estructura de datos del tipo que necesitas. Puedes acceder a los datos por nombre asignado o por indice comenzando en 1.

Saludos
  • ............................................Imagen
    ......................................Imagen
mcr_bkn
Mensajes: 19
Registrado: 01 Abr 2013, 18:29

Re: Ayuda con DllStructCreate y DllStructGetData

Mensaje por mcr_bkn »

Dany escribió:Y la duda es?
Lo que pasa es que trato de estudiar este codigo:

Código: Seleccionar todo

Global Const $DBT_DEVICEREMOVECOMPLETE = "0x00008004" 
Dim $USB_ATTENTION = "0x00000007" 

Global Const $DBT_DEVICEARRIVAL     = 0x00008000 
Global Const $WM_DEVICECHANGE       = 0x0219 
Global Const $tagDEV_BROADCAST_HDR  = "dword dbchsize;dword dbchdevicetype;dword dbchreserved"
Global Const $DBT_DEVTYP_VOLUME     = 0x00000002 
Global Const $tagDEV_BROADCAST_VOLUME   = "dword dbcvsize;dword dbcvdevicetype;dword dbcvreserved;dword dbcvunitmask;short dbcvflags"
Global Const $DBTF_MEDIA            = 0x0001 
Global Const $DBTF_NET              = 0x0002 
;Setup The GUI to watch for the DeviceChange Event

GUICreate("Test") ;Crea una Gui
GUIRegisterMsg($WM_DEVICECHANGE, "DeviceChange") ; Registra el mensaje del cambio de dispositivo

While 1
    Sleep (1000)
WEnd

Func DeviceChange($hWndGUI, $MsgID, $WParam, $LParam)
   ;ConsoleWrite($wparam)
    $iEvent = $WParam
   If $iEvent=$DBT_DEVICEREMOVECOMPLETE Then ; 
            $temp = DllStructCreate($tagDEV_BROADCAST_HDR, $LParam)
            $iDeviceType = DllStructGetData($temp, "dbchdevicetype")
            If $iDeviceType = $DBT_DEVTYP_VOLUME Then
                $struct = DllStructCreate($tagDEV_BROADCAST_VOLUME, $LParam)
                $iUnitMask = DllStructGetData($struct, "dbcvunitmask")
                $iFlags = DllStructGetData($struct, "dbcvflags")
                If Not BitAND($iFlags, $DBTF_MEDIA) And Not BitAND($iFlags, $DBTF_NET) Then
                    $sDrive = FirstDriveFromMask($iUnitMask)
                    msgbox(0,"Prueba USB",$sDrive & ": ha sido quitado o removido!" & @CRLF)
					;ConsoleWrite($sDrive & ": ha sido quitado o removido!" & @CRLF)
                EndIf
            EndIf
   EndIf
    If $iEvent = $DBT_DEVICEARRIVAL Then
            $temp = DllStructCreate($tagDEV_BROADCAST_HDR, $LParam)
            $iDeviceType = DllStructGetData($temp, "dbchdevicetype")
            If $iDeviceType = $DBT_DEVTYP_VOLUME Then
                $struct = DllStructCreate($tagDEV_BROADCAST_VOLUME, $LParam)
                $iUnitMask = DllStructGetData($struct, "dbcvunitmask")
                $iFlags = DllStructGetData($struct, "dbcvflags")
                If Not BitAND($iFlags, $DBTF_MEDIA) And Not BitAND($iFlags, $DBTF_NET) Then
                    $sDrive = FirstDriveFromMask($iUnitMask)
                    msgbox(0,"Prueba USB",$sDrive & ": ha sido insertado!" & @CRLF)
					;ConsoleWrite($sDrive & ": ha sido insertado!" & @CRLF)
                EndIf
            EndIf
    EndIf
EndFunc   ;==>DeviceChange

Func FirstDriveFromMask($unitmask)
    Local $i
    For $i = 0 To 25
        If BitAND($unitmask, 0x1) Then ExitLoop
        $unitmask = BitShift($unitmask, 1)
    Next
    Return Chr($i + Asc('A'))
EndFunc
Pero no lo entiendo muy bien, parece que es un poco avanzado, que me recomiendas para entenderlo?? Lo que entiendo de ahi es que crea una GUI y Registra el mensaje del cambio de dispositivo, pero lo trato de seguir entre lineas pero me pierdo, a ver si me pueden guiar un poco o que debo estudiar para aprender y entenderlo??
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Ayuda con DllStructCreate y DllStructGetData

Mensaje por Dany »

Hola. Ahi masomenos te explico.

Código: Seleccionar todo

Global Const $DBT_DEVICEREMOVECOMPLETE = "0x00008004"
Dim $USB_ATTENTION = "0x00000007"

Global Const $DBT_DEVICEARRIVAL = 0x00008000
Global Const $WM_DEVICECHANGE = 0x0219
Global Const $tagDEV_BROADCAST_HDR = "dword dbchsize;dword dbchdevicetype;dword dbchreserved"
Global Const $DBT_DEVTYP_VOLUME = 0x00000002
Global Const $tagDEV_BROADCAST_VOLUME = "dword dbcvsize;dword dbcvdevicetype;dword dbcvreserved;dword dbcvunitmask;short dbcvflags"
Global Const $DBTF_MEDIA = 0x0001
Global Const $DBTF_NET = 0x0002
;Setup The GUI to watch for the DeviceChange Event

GUICreate("Test") ;Crea una Gui
GUIRegisterMsg($WM_DEVICECHANGE, "DeviceChange") ; Registra el mensaje del cambio de dispositivo

While 1
	Sleep(1000)
WEnd

Func DeviceChange($hWndGUI, $MsgID, $WParam, $LParam)
;~  $hWndGUI=handle de la ventana
;~ $MsgID = mensaje  WM_DEVICECHANGE No es necesario porque estamos registrando solamente ese mensaje
;~ 	$WParam=eventos que ocurren puede ser cualquiera de estos:
;~ DBT_CONFIGCHANGECANCELED
;~ 0x0019
;~ A request to change the current configuration (dock or undock) has been canceled.
;~ DBT_CONFIGCHANGED
;~ 0x0018
;~ The current configuration has changed, due to a dock or undock.
;~ DBT_CUSTOMEVENT
;~ 0x8006
;~ A custom event has occurred.
;~ DBT_DEVICEARRIVAL
;~ 0x8000
;~ A device or piece of media has been inserted and is now available.
;~ DBT_DEVICEQUERYREMOVE
;~ 0x8001
;~ Permission is requested to remove a device or piece of media. Any application can deny this request and cancel the removal.
;~ DBT_DEVICEQUERYREMOVEFAILED
;~ 0x8002
;~ A request to remove a device or piece of media has been canceled.
;~ DBT_DEVICEREMOVECOMPLETE
;~ 0x8004
;~ A device or piece of media has been removed.
;~ DBT_DEVICEREMOVEPENDING
;~ 0x8003
;~ A device or piece of media is about to be removed. Cannot be denied.
;~ DBT_DEVICETYPESPECIFIC
;~ 0x8005
;~ A device-specific event has occurred.
;~ DBT_DEVNODES_CHANGED
;~ 0x0007
;~ A device has been added to or removed from the system.
;~ DBT_QUERYCHANGECONFIG
;~ 0x0017
;~ Permission is requested to change the current configuration (dock or undock).
;~ DBT_USERDEFINED
;~ 0xFFFF
	$iEvent = $WParam ;asignamos a $ievent lo que tenemos en $WParam
	If $iEvent = $DBT_DEVICEREMOVECOMPLETE Then ;
		$temp = DllStructCreate($tagDEV_BROADCAST_HDR, $LParam);creamos la estructura que contiene datos específicos del evento.
		$iDeviceType = DllStructGetData($temp, "dbchdevicetype") ;detectamos sea disco
		If $iDeviceType = $DBT_DEVTYP_VOLUME Then ;detectamos sea disco
			$struct = DllStructCreate($tagDEV_BROADCAST_VOLUME, $LParam) ;para obtener datos del disco usamos la structura DEV_BROADCAST_VOLUME
			$iUnitMask = DllStructGetData($struct, "dbcvunitmask") ;La unidad lógica máscara identifica una o más unidades lógicas. Cada bit de la máscara corresponde a una unidad lógica. Bit 0 representa la unidad A, el bit 1 representa la unidad B, y así sucesivamente.
			$iFlags = DllStructGetData($struct, "dbcvflags")
;~ DBTF_MEDIA
;~ 0x0001
;~ Cambiar afecta medio en la unidad. Si no se establece, el cambio afecta dispositivo físico o en coche.
;~ DBTF_NET
;~ 0x0002
;~ Volumen lógico indicado es un volumen de red.
			If Not BitAND($iFlags, $DBTF_MEDIA) And Not BitAND($iFlags, $DBTF_NET) Then ;trabajamos a nivel de bits
				$sDrive = FirstDriveFromMask($iUnitMask);obtenemos la letra
				MsgBox(0, "Prueba USB", $sDrive & ": ha sido quitado o removido!" & @CRLF)
				;ConsoleWrite($sDrive & ": ha sido quitado o removido!" & @CRLF)
			EndIf
		EndIf
	EndIf
	If $iEvent = $DBT_DEVICEARRIVAL Then
		$temp = DllStructCreate($tagDEV_BROADCAST_HDR, $LParam)
		$iDeviceType = DllStructGetData($temp, "dbchdevicetype")
		If $iDeviceType = $DBT_DEVTYP_VOLUME Then
			$struct = DllStructCreate($tagDEV_BROADCAST_VOLUME, $LParam)
			$iUnitMask = DllStructGetData($struct, "dbcvunitmask")
			$iFlags = DllStructGetData($struct, "dbcvflags")
			If Not BitAND($iFlags, $DBTF_MEDIA) And Not BitAND($iFlags, $DBTF_NET) Then
				$sDrive = FirstDriveFromMask($iUnitMask)
				MsgBox(0, "Prueba USB", $sDrive & ": ha sido insertado!" & @CRLF)
				;ConsoleWrite($sDrive & ": ha sido insertado!" & @CRLF)
			EndIf
		EndIf
	EndIf
EndFunc   ;==>DeviceChange

Func FirstDriveFromMask($unitmask)
	Local $i
	For $i = 0 To 25
		If BitAND($unitmask, 0x1) Then ExitLoop
		$unitmask = BitShift($unitmask, 1)
	Next
	Return Chr($i + Asc('A'))
EndFunc   ;==>FirstDriveFromMask
Saludos
  • ............................................Imagen
    ......................................Imagen
Responder