Página 1 de 1

Função DiskReady() em Harbour

Enviado: 31 Out 2014 13:44
por Jairo Maia
Olá Pessoal,

Em xHarbour, na lib HBCT:
A Função IsDisk() retorna se o Drive existe.
A Função DriveType() retorna o tipo do Drive
A Função DiskReady() retorna se o Drive está pronto

O que não estou achando é qual função substitui a DiskReady() no Harbour. Porque ela foi excluída da HBCT do Harbour?

Função DiskReady() em Harbour

Enviado: 31 Out 2014 14:33
por janio
Nao tem como pegar os fontes em .c dessa função? ae vc poderia colocar em qq prg seu

Janio

Função DiskReady() em Harbour

Enviado: 31 Out 2014 14:58
por Kapiaba
Veja se ajuda:

Código: Selecionar todos

/* *************************** */

#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..
Com 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

nSetErrorMode := SETERRORMODE( 1 )
lExist := GetDiskFreeSpace( Left( cDisk, 1) + ":\" )
SETERRORMODE( nSetErrorMode )

Return lExist
/* *************************** */

Função DiskReady() em Harbour

Enviado: 31 Out 2014 17:51
por Jairo Maia
Olá Jânio,
janio escreveu:Nao tem como pegar os fontes em .c dessa função? ae vc poderia colocar em qq prg seu
Jânio, desculpe ai meu lapso... rs... Deu certo. Valeu a dica!

Minha função de backup verifica todas as unidades disponíveis e apresenta um menu para o usuário escolher onde será efetuado o Backup, e avisa se a unidade é Fixa, Removível ou da Rede (desde que mapeada).

Acontece que quando verifica a unidade de DVD, emite a mensagem do Windows solicitando para o usuário inserir um disco, e precisa clicar em cancelar. Isto acontece também com a unidade do Certificado. Eu queria a função DiskReady(), porque com ela tenho como neutralizar essa mensagem:
lMode:
True = Windows/DOS mode. If a disk is not ready, open a dialog.
False = Bios mode. If a disk is not ready don´t open a dialog.
Mas para minha surpresa, essa função é em puro código xBase. Vejam:

Código: Selecionar todos

*-----------------------------------
FUNCTION DiskReady( cDrive , lMode )
*-----------------------------------
   LOCAL lReturn, cCurrent := TrueName(".")

   //default( @lMode , .F. )
   lMode := If( Empty( lMode ), .F., lMode )
   
   // lMode -> True = Windows/DOS mode. If a disk is not ready, open a dialog.
   //          False = Bios mode. If a disk is not ready don´t open a dialog.

   IF empty(cDrive) .OR. !isalpha(cDrive)
      cDrive := cCurrent
   ENDIF

   IF valtype(lMode) != "L"
      lMode := .F.
   ENDIF

   IF !lMode
      // Windows/DOS access mode. xHarbour RTL. Source is in "dirdrive.c".
      lReturn := DiskChange( cDrive )
      IF lReturn
         DiskChange( cCurrent )
      ENDIF
   ELSE
      // Bios access mode. xHarbour RTL. Source is in "dirdrive.c".
      lReturn := IsDisk( cDrive )
   ENDIF

RETURN ( lReturn )
Mensagem Editada em: 06/11/2014 - 07h59m.
Para que essa função funcione corretamente em Harbour, a linha 4 que estava assim:

Código: Selecionar todos

LOCAL lReturn, cCurrent := DiskName()
Foi substituída por:

Código: Selecionar todos

LOCAL lReturn, cCurrent := TrueName(".")
Olá Kapiaba,
Obrigado pela atenção, mas os códigos que você postou não têm esse efeito. Obrigado.

Nota: O pulo do gato esta na DiskChange().

Tag: DiskReady

[Problema Resolvido]