Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-09-2004
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Problema con EAccessViolation en Disco Duro

Ante todo disculpad si la pregunta no corresponde a este foro 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



Última edición por salvica fecha: 03-09-2004 a las 21:18:37.
Responder Con Cita
  #2  
Antiguo 03-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 03-09-2004
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 03-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 03-09-2004
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
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

De todas formas, lo que me extraña es que solo me lo dá bajo el IDE
Responder Con Cita
  #6  
Antiguo 03-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #7  
Antiguo 03-09-2004
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Cita:
Empezado por roman
Oye, y si activas la opción "Stop on Delphi Exceptions"
¿Donde activo esto?

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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 06:12:23.


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
Copyright 1996-2007 Club Delphi