PDA

Ver la Versión Completa : Ejecutable desde servidor


Willo
18-03-2016, 20:32:21
Por alguna extraña razon que aun no comprendo, una aplicacion que tengo, funciona diferente si la ejecuto desde el servidor de una red a que si la ejecuto desde una maquina normal.

La aplicacion esta desarrollada en Delphi 7 y usa MyDAC para conectarse al servidor de base de datos (MySQL)...

En lo que averiguo que diantres esta pasando, pregunto:

hay alguna consideracion especial que debiera tomar en cuenta si quiero que mi aplicacion funcione ejecutandola desde el servidor, cambiandole solo el acceso directo a las maquinas?, debo configurar algo diferente en el servidor?

Mi temor es que al usar varias personas el mismo ejecutable, colapse por alguna razon.

AgustinOrtu
18-03-2016, 21:02:31
Y que hace diferente? Como la ejecutas?

Willo
18-03-2016, 21:07:28
Basicamente el problema esta en un proceso que el sistema hace al leer unos archivos de texto (que estan en una carpeta del servidor)...

he estado revisando permisos del usuario desde la maquina cliente, ejecutando la aplicacion como Administrador en la maquina cliente, etc...

hasta ahorita, el mismo proceso en el servidor, me lee la informacion correctamente, ejecutando el EXE que esta en el servidor desde la maquina cliente tambien hace el proceso correcto... el problema esta cuando ejecuto el mismo EXE desde la maquina cliente...

AgustinOrtu
18-03-2016, 22:36:16
Y cual es el error?

Casimiro Notevi
19-03-2016, 01:15:48
Y que hace diferente? Como la ejecutas?
Y cual es el error?

Y es que no somos adivinos, pon código fuente, que se nos averió la bola de cristal :)

Willo
21-03-2016, 06:00:35
Amigos, de antemano agradezco su interes y disposición para ofrecerme su ayuda y consejo... puedo poner el código fuente de la aplicación, pero el caso es que, el código funciona bien!, hace lo que se supone debe hacer de la manera que se supone lo haga... pero solo cuando lo ejecuto en el servidor y en algunas máquinas conectadas a la red.

Sospecho que el problema venga de un asunto de permisos o algo asi, sin embargo; ya agote mis opciones y paciencia.

Si ejecuto la aplicación en el servidor desde una de las maquinas problemáticas, funciona perfectamente; y es por eso que mi pregunta original es para saber que consideraciones debo tomar en cuenta si quiero que todos los usuarios ejecuten la aplicación EN el servidor.

Gracias a todos nuevamente

AgustinOrtu
21-03-2016, 15:49:01
Todavia no nos has explicado que es lo que debe hacer tu codigo y que es lo que hace desde una de las maquinas problematicas

No hace falta que publiques el codigo fuente entero, solo las partes involucradas en este problema

Decis arriba que lo que hace es leer unos archivos de texto. Ok, como los lees? Los abris con un TStringList? O usando file of y luego leyendo con Readln?

Cual es exactamente el problema, que es lo que hace mal? No puede abrir el archivo? Lo abre pero no lo recorre? Ves la mitad? Ves informacion de mas? De menos?

Es realmente imposible darte una respuesta

Consideraciones a tener en cuenta... de nuevo, imposible decirlo, ya que no sabemos que es lo que hace tu programa. Tenes que escribir en el archivo? Definitivamente hay que fijarse si esta en uso o no, y al abrir el archivo hay que hacerlo indicando que solo nosotros podemos operar con el. La mas tonta, el archivo existe? Como se selecciona ese archivo, lo indica el usuario (como lo indica, usa un OpenDialog) o estan en una carpeta fija. Esa carpeta fija es accesible? Como se indica la ruta? Es absoluta o relativa? Corresponde a una ruta local (C:\carpeta\archivo.txt) o a una ruta de red (\\SERVER\C:\carpeta\archivo.txt). Etc, etc, etc, la cantidad de "consideraciones" y "preguntas" son infinitas, a menos que nos des mas informacion

Casimiro Notevi
21-03-2016, 17:14:54
Ummm... :)

http://fotos.subefotos.com/6b601b99e8ad896d8c8bd6d9b24d3532o.jpg

AgustinOrtu
21-03-2016, 19:52:15
Ummm... :)

http://fotos.subefotos.com/6b601b99e8ad896d8c8bd6d9b24d3532o.jpg

Yo froto y froto pero no pasa nada...:confused:

elrayo76
21-03-2016, 20:27:41
Explica paso por paso lo que haces para ejecutar tu aplicación cuando anda bien y cuando no funciona. Debes decirnos que es lo que tiene que hacer tu aplicación y que no lo hace.

Pon el mensaje de error si es que tienes alguno.

Si el problema es que no se lee correctamente ese archivo de texto que dices que tienes el tema es que tanto la aplicación como el archivo deben tener los permisos adecuados.

A mi me paso algo con los permisos que te comento por si te sirve de algo. Tengo un servicio de impresión corriendo en Windows que cada 1 o 2 segundos levanta de una tabla los datos a imprimir en una impresoras de etiquetas. Además estos datos los usaba para reemplazar unas variables dentro del archivo de texto que tenia el formato con el código para la impresora.

El servicio funcionaba correctamente y no dejaba error alguno. El problema era que el archivo de texto no tenia los permisos corecto. Este archivo tenía que ser levantado con el mismo usuario que se corria el servicio. Para esto tuvo que cambiar los permisos y usuarios que tenia el archivo de texto.

Saludos,
El Rayo

AgustinOrtu
21-03-2016, 20:48:16
Es que las posibilidades son practicamente infinitas

Puede ser hasta un problema de Encoding

Pero que yo sepa, el brainstorming como metodologia de resolucion de problemas no es el mas adecuado

Willo
22-03-2016, 03:43:45
Ok chicos vale...
if Earchivo1.Filename <> '' then
begin
CopyFile(PChar(Earchivo1.Filename), PChar(xrutap+(Extractfilename(Earchivo1.Filename))), False);
if fileexists(xrutap+extractfilename(Earchivo1.Filename)) then
begin
Dm.Bitacora('Ordenes de trabajo','Agregado de archivo Exp Elect',Esolicitud.Text,xrutap+(Extractfilename(Earchivo1.Filename)));
Deletefile(Earchivo1.Filename);Básicamente ese es el código "problemático"... los archivos que se estan copiando de una ruta a otra estan en el servidor (Windows 2008 R2) y como les comentaba, en algunas máquinas de la red el código funciona sin problema, en otras falla sin devolver ningún error, si ejecuto el ejecutable en el servidor desde cualquier máquina, también funciona sin problema.

Aislando el problema todo se origina ahí, ya que la lectura de los archivos viene después, pero... como en ocasiones ni siquiera los copia a donde deben estar, el proceso de lectura deja un error de apertura en la bitácora.

Cabe mencionar que en todos los casos las pruebas las he realizado usando el administrador como usuario para realizar la conexion al servidor.

Gracias de antemano

Reasen
22-03-2016, 11:55:09
Veo que copias el archivo y luego compruebas si se a copiado, si es así entonces eliminas el archivo original...


MoveFileA
:rolleyes:

Mete esto en una variable, sera mas comodo de leer: "xrutap+(Extractfilename(Earchivo1.Filename)"

elrayo76
22-03-2016, 14:18:33
Como te comente antes, intenta ver los permisos de los archivos a ver si es por eso que no hace lo correcto. Por mas que uses un usuario administrador puede que no te funcione.

Si los archivos se suben al servidor con un usuario puede que otro por mas que sea administrador no lo vea o la aplicación no los pueda usar correctamente. Esto puede pasar con los nombre de máquinas, segun este armado el esquema de permisos en los sorvidores.

saludos

AgustinOrtu
22-03-2016, 15:18:11
Asegurate de leer la documentación

La funcion CopyFile (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363851(v=vs.85).aspx) devuelve True o False segun la operación tuvo éxito o no

Tu error es que tu codigo sigue operando sin chequear el valor de retorno. Las funciones de la API de Windows no suelen elevar excepciones; es por esto que la mayoria retorna el Boolean

Luego, existe el método RaiseLastOSError (http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.RaiseLastOSError) definido en la unidad SysUtils que eleva una excepción con el mensaje y código de la última excepción que se generó al llamar una llamada a la API de Windows

Podrías refactorizar tu código de la siguiente manera:


if not CopyFile(...) then
RaiseLastOSError;

// código que se ejecuta si el archivo fue copiado con éxito


Otra forma de hacerlo en mi opinión mas limpia es usando la funcion Win32Check (http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.Win32Check), también de la unidad SysUtils

Win32Check chequea el valor de retorno de la función en cuestión, y si es False (hubo un error) invoca a RaiseLastOSError


if Win32Check(CopyFile(...)) then
begin
// código que se ejecuta si el archivo fue copiado con éxito
end;

AgustinOrtu
22-03-2016, 15:22:57
Por otra parte, que hace el metodo Dm.Bitacora

Has probado depurar la aplicacion? Podrias ir imprimiendo mensajes en pantalla o en un archivo para ver "hasta donde llega"

Es mejor trabajar con información real y no andar jugando a las adivinanzas

Willo
22-03-2016, 19:40:01
No cabe duda que aqui siempre hay oportunidad para aprender de los grandes...

Gracias chicos, incorporare sus sugerencias a mi codigo y espero que eso arroje luz a mi ceguera.