Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema con EAccessViolation en Disco Duro (https://www.clubdelphi.com/foros/showthread.php?t=13933)

salvica 03-09-2004 21:15:47

Problema con EAccessViolation en Disco Duro
 
Ante todo disculpad si la pregunta no corresponde a este foro :confused: pero me parecia que era el más apropiado

El problema es el siguiente:
Estoy pasando una aplicación en Delphi-3 a Delphi-7, utilizando objetos Indy y preparando la aplicación para que corra en Windows y Linux, por lo que he declarado una constante global "OS_Separador" de la siguiente forma
Código Delphi [-]
  {$ifdef LINUX}
  const  OS_Separador = '/';
  {$else}
  const  OS_Separador = '\';
  {$endif}
  
  var
  {
    variables globales del proceso
  }
    Win_Main     : TWin_Main;
    DIR_MAIN     : string; //-----> el directorio de trabajo (C:\DATOS)
En una unidad aparte, leo los ficheros que contiene un TListBox y si no existen en el directorio de descarga los bajo con un TIdFtpClient
Código Delphi [-]
    DIR_DOS = DIR_MAIN + OS_Separador + 'TEXTOS';
    while ListBox_HOST.Items.Count>0 do begin
        { evitar el cuelgue del sistema }
          Application.ProcessMessages;
        { cambiar blancos, puntos y comas del nombre de fichero por "_" }
          tmpFichero := limpiarNombreDeFichero( ListBox_HOST.Items[0] );
          StatusBar.Panels[1].Text := ' ---> Tratando ---> '+tmpFichero;
          tmpFileFull              := DIR_DOS+OS_Separador+tmpFichero+'.TXT';
          //tmpFileFull              := DIR_DOS+'\'+tmpFichero+'.TXT';
          if not FileExists( tmpFileFull ) then begin
          { descargar el fichero del servidor }
            IdFTPClient.Get(ListBox_HOST.Items[0], tmpFileFull, true, false);
          { evitar el cuelgue del sistema }
             Application.ProcessMessages;
          end;
        { eliminar el fichero tratado }
          ListBox_HOST.Items.Delete( 0 );
    end;
El problema radica en que cuando utilizo la constante OS_Separador como parte del nombre del fichero, el sistema me dá el siguiente mensaje de error:
class EAccessViolation with message 'Access violation at address 00000003'. Read of address 00000003
y no me deja continuar, sin embargo si no utilizo la constante la descarga se realiza con normalidad ¿?

He probado a incluir un try except end; y no me salta excepción alguna, por lo que opté a incluir el segundo Application.ProcessMessages

Creo que solo queda decir que uso wXP Prof. y que si ejecuto la aplicación fuera del IDE no da ningún problema ¿? pero, claro, necesito correrla en el IDE para depurarla



roman 03-09-2004 21:34:36

Aunque no es una respuesta a tu pregunta, ¿no te serviría armar todas las rutas como si fueran de Windows y luego usar la función DosPathToUnixPath para convertir la ruta?.

// Saludos

salvica 03-09-2004 21:50:30

Cita:

Empezado por roman
Aunque no es una respuesta a tu pregunta, ¿no te serviría armar todas las rutas como si fueran de Windows y luego usar la función DosPathToUnixPath para convertir la ruta?.

Ya lo habia pensado, pero es que tengo muchas instrucciones que lo utilizan y entonces debería multiplicar las peguntas respecto al S.O. en el que estoy ejecutando la aplicación

roman 03-09-2004 22:06:20

No necesariamente. Te armas una función:

Código Delphi [-]
function OSPath(DosPath: String): String;
begin
  if OS_Es_Unix
    then Result := DosPathToUnixPath(DosPath)
    else Result := DosPath;
end;

Así, armas tu path al estilo Dos y al utilizarlo usas OsPath(DosPath).

// Saludos

salvica 03-09-2004 22:18:57

Me he creado esta función
Código Delphi [-]
   function  pathDelSistema( Cadena:string ):string;
   begin
   {$IfDef LINUX}
     Result := DosPathToUnixPath( Cadena );
   {$Else}
     Result := UnixPathToDosPath( Cadena );
   {$EndIf}
   end;
y me sigue dando el mensaje de error :confused::confused::confused:

De todas formas, lo que me extraña es que solo me lo dá bajo el IDE

roman 03-09-2004 22:24:52

Oye, y si activas la opción "Stop on Delphi Exceptions", ¿cuando salta la excepción te lleva a una ventana del cpu? De ser así, ¿que dice la línea donde se detiene?

// Saludos

pd: Mucho mejor tu función, te evitas el condicional durante la ejecución :)

salvica 03-09-2004 22:39:21

Cita:

Empezado por roman
Oye, y si activas la opción "Stop on Delphi Exceptions"

¿Donde activo esto? :confused::confused:

Cita:

Empezado por roman
¿cuando salta la excepción te lleva a una ventana del cpu? De ser así, ¿que dice la línea donde se detiene?

Código Delphi [-]
 TDirectory.ChangeNotification:
 00441274    B201    mov d1,$01
 00441276    8B08    mov ecx, [eax]
 00441278    FF511C  call dword ptr [ecx+$1c] //---> me trae aqui
 0044127B    C3      ret


La franja horaria es GMT +2. Ahora son las 07:44:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi