Hola amigos:
Que funciones hay para operar con la unidad USB, necesito saber que letra tiene. (F, G, etc).
comprobar si la unidad USB este disponible para grabar en ella. ?, etc.
Saludos.
Jose.
Funciones para trabajar con unidad USB
Funciones para trabajar con unidad USB
Fwh 19.06 32 bits + Harbour 3.2dev(r2011030937)+ Borland 7.4 + FivEdit
Re: Funciones para trabajar con unidad USB
Buenas tardes José,
has mirado el ejemplo protect.prg del directorio samples ?
Muchas gracias.
Saludos
has mirado el ejemplo protect.prg del directorio samples ?
Muchas gracias.
Saludos
Re: Funciones para trabajar con unidad USB
Quizás te ayude....brakaman wrote:Hola amigos:
Que funciones hay para operar con la unidad USB, necesito saber que letra tiene. (F, G, etc).
comprobar si la unidad USB este disponible para grabar en ella. ?, etc.
Saludos.
Jose.
Code: Select all
/* **********************************************************************
18/11/2008
Aquí dejaré las funciones genéricas que utilizaré para la gestión de la
protección con USB.
-La función cGetSerialProtect() es la que nos dirá el número de serie
de el USB que escojamos de la lista que nos enseñe.
Se puede usar en un menú de configuración de la aplicación para que el
usuario nos facilite el número de serie del USB que utilizará.
********************************************************************** */
#include "FiveWin.ch"
#define DRIVE_REMOVABLE 2
/* *************************** */
/* *****************************************************************
A partir de un número de serie obtiene la letra del Pendrive USB.
-------------------------------------------------------------- */
STATIC FUNCTION cNumUSB2LetUSB( cNumUSB )
Local cLetter := ""
Local nBitDrives := GetLogicalDrives()
Local nContador := 0
Local cDrive := ""
Local USBSerial := ""
For nContador := 1 to 32
If lAnd( nBitDrives, 2 ^ ( nContador - 1 ) )
cDrive = Chr( Asc( "A" ) - 1 + nContador ) + ":\"
If nContador != 1 .and. GetDriveType( cDrive ) == DRIVE_REMOVABLE
USBSerial := GetUSBSerial( cDrive )
If valType( USBSerial ) = "C"
If USBSerial == cNumUSB
cLetter := cDrive
Exit
EndIf
Else
Traza( 1, "USBSerial=", USBSerial )
cLetter := "Error: Obtenido ValType( USBSerial) <> 'C'"
Traza( 1, "cLetter:", cLetter )
EndIf
Endif
Endif
Next
Return cLetter
/* *************************** */
/* *************************** */
/* ***********************************************************************
A partir d'una lletra d'un USB inicia la cerca del seu número de sèrie.
-------------------------------------------------------------------- */
STATIC FUNCTION GetUSBSerial( cDrive )
Local oLoc := CreateObject( "wbemScripting.SwbemLocator" )
Local oSrv := oLoc:ConnectServer()
Local oJobs := oSrv:ExecQuery( "SELECT * FROM Win32_LogicalDiskToPartition" )
Local oJob
Local cDriveNumber
cDrive = Upper( cDrive )
If Len( cDrive ) == 1
cDrive += ":"
Endif
If Len( cDrive ) > 2
cDrive = SubStr( cDrive, 1, 2 )
Endif
For each oJob in oJobs
If cDrive == StrToken( oJob:Dependent, 2, '"' )
cDriveNumber = SubStr( StrToken( StrToken( oJob:Antecedent, 2, '"' ), 1, "," ), 7 )
return GetSerial( oSrv, cDriveNumber )
Endif
Next
Return "."
/* *************************** */
/* *************************** */
/* *********************************************************
Cerca a partir d'una lletra d'USB el seu número de sèrie.
------------------------------------------------------ */
STATIC FUNCTION GetSerial( oSrv, cDriveNumber )
Local aDrives := oSrv:ExecQuery( "SELECT * FROM Win32_DiskDrive" )
Local oDrive, cSerial := ""
For each oDrive in aDrives
If oDrive:Name == "\\.\PHYSICALDRIVE" + cDriveNumber .and. ;
oDrive:InterfaceType == "USB"
cSerial = oDrive:PNPDeviceID
cSerial = SubStr( cSerial, 1, RAt( "&", cSerial ) - 1 )
cSerial = SubStr( cSerial, RAt( "&", cSerial ) + 1 )
If At( "\", cSerial ) != 0
cSerial = SubStr( cSerial, At( "\", cSerial ) + 1 )
Endif
Return cSerial
//Exit
Endif
Next
Return cSerial
/* *************************** */
/* *************************** */
/* *************************** */
FUNCTION cSelectUSB( lMensaje )
Local aDriveUSB := {}
Local nDriveUSB := 0
Local cDriveUSB := ""
Local nContador := 0
aDriveUSB := aUSBDrive()
If Len( aDriveUSB ) = 0
If lMensaje
MsgAlert( GetTrad("No hi han unitats USB disponibles, insereixi una unitat USB."), GetTrad("A T E N C I Ó !" ) )
EndIf
Else
nDriveUSB := MsgList( aDriveUSB, GetTrad("Unitats USB disponibles:"), Nil, Nil, Nil, 15, "Seleccionar", nDriveUSB, .T., Nil )
//Traza( 1, nDriveUSB := MsgList( aDriveUSB, GetTrad("Unitats USB disponibles:"), Nil, Nil, Nil, 15, "Seleccionar", nDriveUSB, .T., Nil ) )
If nDriveUSB > 0
cDriveUSB := SubStr( aDriveUSB[ nDriveUSB ], 1, 3 )
Traza(1, "aDriveUSB[ nDriveUSB ]=", aDriveUSB[ nDriveUSB ])
EndIf
EndIf
Traza(1, "cDriveUSB=", cDriveUSB)
Return cDriveUSB
/* *************************** */
/* *************************** */
#pragma BEGINDUMP
#include "hbapi.h"
#include "windows.h"
HB_FUNC( SETERRORMODE )
{
hb_retni( SetErrorMode( hb_parni( 1 ) ) ) ;
}
HB_FUNC( GETDISKFREESPACE ) // cRootPathName, @nSectorsByCluster, @nBytesPerSector,
// @nNumberOfFreeClusters, @nTotalNumberOfClusters --> lResult
{
LPSTR lpRootPathName = hb_parc( 1 );
DWORD SectorsPerCluster;
DWORD BytesPerSector;
DWORD NumberOfFreeClusters;
DWORD TotalNumberOfClusters;
hb_retl( GetDiskFreeSpace( lpRootPathName, &SectorsPerCluster,
&BytesPerSector, &NumberOfFreeClusters,
&TotalNumberOfClusters ) );
hb_stornl( SectorsPerCluster, 2 );
hb_stornl( BytesPerSector, 3 );
hb_stornl( NumberOfFreeClusters, 4 );
hb_stornl( TotalNumberOfClusters, 5 );
}
#pragma ENDDUMP
/* *************************** */
/* *************************** */
FUNCTION lExistUSB( cDisk )
/* Se da el caso de que con un PenDrive (al menos el que yo he usado) las
funciones IsDisk() y lIsDir() dan .F..
Cuando se trata de una tarjeta de memoria (por ejemplo XD) insertada en
un lector de tarjetas externo conectado a un puerto USB, la IsDisk() sigue
dando .F. y la lIsDir() da .T..
Como lo que se pretende es poder saber que unidades USB son susceptibles de
usarse independientemente de PenDrive o tarjetas de memoria, se opta por
la función GetDiskFreeSpace() que da .T. tanto para PenDrive como para
tarjetas de memoria.
22/08/2010
*/
Local lExist := .F.
Local nSetErrorMode := 0
//Traza( 1, "cDisk=", cDisk )
//Traza( 1, "1-SETERRORMODE=", SETERRORMODE() )
nSetErrorMode := SETERRORMODE( 1 )
//Traza( 1, "1-nSetErrorMode=", nSetErrorMode )
//lExist := IsDisk( Left( cDisk, 1) + ":" )
//Traza( 1, "1-lExist=", lExist )
//lExist := lIsDir( Left( cDisk, 1) + ":\" )
//Traza( 1, "2-lExist=", lExist )
lExist := GetDiskFreeSpace( Left( cDisk, 1) + ":\" )
//Traza( 1, "3-lExist=", lExist )
nSetErrorMode := SETERRORMODE( nSetErrorMode )
//Traza( 1, "2-nSetErrorMode=", nSetErrorMode )
//Traza( 1, "2-SETERRORMODE=", SETERRORMODE() )
Return lExist
/* *************************** */
/* *************************** */
/* ************************************
Torna una array dels USB connectats.
--------------------------------- */
STATIC FUNCTION aUSBDrive()
Local nBitDrives := GetLogicalDrives()
Local nContador := 0
Local cDrive := ""
Local aDrives := {}
For nContador := 1 to 32
If lAnd( nBitDrives, 2 ^ ( nContador - 1 ) )
cDrive = Chr( Asc( "A" ) - 1 + nContador ) + ":\"
If nContador != 1 .and. GetDriveType( cDrive ) == DRIVE_REMOVABLE
If lExistUSB( cDrive )
AAdd( aDrives, cDrive )
EndIf
Endif
Endif
Next
Return aDrives
/* *************************** */
/* *************************** */
/* *************************** */
/* *************************** */
/* *************************** */
Un Saludo
Carlos G.
FiveWin 19.06 + Harbour 3.2, BCC 7 Windows 10
Carlos G.
FiveWin 19.06 + Harbour 3.2, BCC 7 Windows 10
Re: Funciones para trabajar con unidad USB
Warning W8075 USBFUNC.prg 174:Suspicious pointer conversion in function HB_FUN_GETDISKFREESPACE
Error: Unresolved external '_HB_FUN_TRAZA'
Error: Unresolved external '_HB_FUN_GETTRAD'
Saludos.
Error: Unresolved external '_HB_FUN_TRAZA'
Error: Unresolved external '_HB_FUN_GETTRAD'
Saludos.
João Santos - São Paulo - Brasil
Re: Funciones para trabajar con unidad USB
Buenas tardes:
Gracias por las funciones USB , las quiero usar para hacer copias de seguridad, voy a estudiar cuales me valen, pero creo que con esto tendre suficiente.
Muchisimas gracias..
Saludos.
Jose.
Gracias por las funciones USB , las quiero usar para hacer copias de seguridad, voy a estudiar cuales me valen, pero creo que con esto tendre suficiente.
Muchisimas gracias..
Saludos.
Jose.
Fwh 19.06 32 bits + Harbour 3.2dev(r2011030937)+ Borland 7.4 + FivEdit