Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=26)
-   -   Aplicación necesita permisos de adminsitrador o no funciona. (https://www.clubdelphi.com/foros/showthread.php?t=64325)

JuanErasmo 26-03-2009 22:49:47

Aplicación necesita permisos de adminsitrador o no funciona.
 
Buen dia,

Tengo una aplicación que funciona "perfectamente" cuando el usuario es administrador, pero, una vez se restringe el usuario a "no administrador" deja de funcionar. El error específico es : "Access violation 0c00000142" la aplicación no se ha podido inicializar.......

Ya me duele la cabeza intentando cosas diferente, permisos a carpetas específicas , lo último que leí fue algo con las runtimes libraries y en otro foro hablan tambien de la memoria RAM, pero realmente nada me ha funcionado.

Alguien tiene algún conocimiento sobre esto? le agradecería sobremanera!

Muchas Gracias a todos.

ContraVeneno 26-03-2009 22:58:06

El error que mencionas no me suena a que sea por cuestión de permisos...

Generalmente ese error aparece cuando quieres utilizar algo que no existe. Lo mejor sería que pusieras el bloque de código que te genera el error, de esa forma alguien podría identificar más rápido el problema.

JuanErasmo 26-03-2009 23:33:35

Lo curioso Contraveneno, es que si le cambio los permisos al usuario y lo ejecuto como administrador si me funciona normal,
eso es lo que me pone a pensar que es por culpa de algun uso no permitido de memoria, pero como se puede configurar para que la aplicacion funcione?

por favor, necesito esta ayuda urgente,

Gracias!

JuanErasmo 26-03-2009 23:34:33

ah Contraveneno se me olvidaba, el bloque de código no se cual es, porque es inmediatamente ejecuto la aplicacion que sucede esto!
gracias!

alquimista 26-03-2009 23:45:54

tiene pinta de una excepcion posiblemente por crear o grabar un archivo en alguna carpeta a la que en modo usuario limitado no se tenga acceso.
Si se escribe en registro de Windows tambien puede dar problemas...
Esto son conjeturas...como dice contraveneno sin algo de código poco se puede afinar...

cHackAll 27-03-2009 02:26:22

JuanErasmo adjunta un pantallazo del error exacto y cuentanos un poco mas de tu aplicacion.

Neftali [Germán.Estévez] 27-03-2009 10:46:44

Deberías explicar qué acciones hace tu programa que puedan ser susceptibles de necesitar permisos de usuario. Escribir en el registro, escribir en determinados directorios, Copia, borrado,...

Puede ser que alguna de estas acciones falle y porteriormente se genere el erorr de memoria.

JuanErasmo 27-03-2009 13:44:05

el código inicial , lee registro y verifica si hay otra instancia corriendo.
 
Código:

#include <vcl.h>
#pragma hdrstop

#include "control.h"
#include "presentacion.h"
#include "varios.h"
//---------------------------------------------------------------------------
USEFORM("videos.cpp", Form_Videos);
USEFORM("source code\about\about.cpp", Form_about);
USEFORM("control.cpp", Form_control);
USEFORM("DBagenda.cpp", Form_DBagenda);
USEFORM("entrada.cpp", Form_entrada);
USEFORM("herramientas.cpp", Form_herramientas);
USEFORM("imagenes.cpp", Form_Imagenes);
USEFORM("Login.cpp", FormLogin);
USEFORM("fondo.cpp", FormFondo);
USEFORM("mensajes.cpp", FormMensajes);
USEFORM("Frame_HistoriaLista.cpp", FrameHistoriaLista); /* TFrame: File Type */
USEFORMNS("C:\Archivos de programa\FastReport253\FastReport\source\FR_View.pas", Fr_view, frPreviewForm);
USEFORMNS("C:\Archivos de programa\FastReport253\FastReport\source\fr_desgn.pas", Fr_desgn, frDesignerForm);
USEFORM("encripcion.cpp", Form_Encripcion);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE OtraInstancia, LPSTR, int)
{
//    PRIORIDAD ALTA A LA APLICACIÓN
//  SetPriorityClass (GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
//  SetThreadPriority(GetCurrentThread(),  THREAD_PRIORITY_TIME_CRITICAL);
  LogAgregar(-1, 0, "Iniciando nueva sesion", TLogTipoInformacion);
  //REVISA SI YA HAY OTRA INSTANCIA DEL PROGRAMA CORRIENDO
    static char szMutexName[] = "MyMutexAplicacion"; // Use a unique name!
    WNDCLASS wc;
    HWND hwnd;
    MSG msg;
    HANDLE hMutex;
    hMutex = CreateMutex (NULL, FALSE, szMutexName);
    if ((hMutex != NULL) && (GetLastError () == ERROR_ALREADY_EXISTS))
    {
        MessageBeep(MB_ICONQUESTION);
        LogAgregar(-1, 0, "Ya se ha iniciado otra sesión de Aplicacion", TLogTipoConfirmacion);
        int YaExiste=Application->MessageBox("Ya se ha iniciado otra sesión de Aplicacion\n\nSe recomienda cerrar esta sesion.  Desea continuar abriendo esta sesion?", "Aplicacion", MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2);
        if(YaExiste==IDNO) {
            LogAgregar(-1, 0, "Cancelado el inicio de Aplicacion", TLogTipoInformacion);
            CloseHandle (hMutex);
            return -1;
        }else{
            LogAgregar(-1, 0, "Iniciando doble sesión", TLogTipoInformacion);
        }
    }

  try
  {
    Application->Initialize();
    Application->Title = "Aplicacion";
    Application->HelpFile = "C:\\Application\\ayuda\\Aplicacion1.HLP";
      Application->CreateForm(__classid(TForm_control), &Form_control);
                Application->CreateForm(__classid(TForm_presentacion), &Form_presentacion);
                Application->CreateForm(__classid(TFormMensajes), &FormMensajes);
                Application->CreateForm(__classid(TForm_about), &Form_about);
                Application->CreateForm(__classid(TForm_DBagenda), &Form_DBagenda);
               
                                                  Application->CreateForm(__classid(TForm_herramientas), &Form_herramientas);
                Application->CreateForm(__classid(TForm_Imagenes), &Form_Imagenes);
                                Application->CreateForm(__classid(TForm_entrada), &Form_entrada);
                                Application->CreateForm(__classid(TFormFondo), &FormFondo);
                Application->CreateForm(__classid(TFormLogin), &FormLogin);
                Application->CreateForm(__classid(TForm_Encripcion), &Form_Encripcion);
                Application->Run();
    // }
    }
  catch (Exception &exception)
  {
      LogAgregar(-1, 0, "Excepcion 1: "+exception.Message, TLogTipoError);
      Application->ShowException(&exception);
      Application->Terminate();   
  }
  catch (...)
  {
      try
      {
          throw Exception("");
      }
      catch (Exception &exception)
      {
          LogAgregar(-1, 0, "Excepcion 2: "+exception.Message, TLogTipoError);
          Application->ShowException(&exception);
          Application->Terminate();        }
  }
  return 0;
}

Gracias,,,,,,,les agradecería mucho su colaboración.

JuanErasmo 27-03-2009 16:58:27

Hola y gracias,

Podrá ser la función utilizada para averiguar si esta corriendo otra instancia del mismo ejecutable???

De verdad, en usuario administrador me trabaja de maravilla, pero luego,
" la aplicacion no se ha inicializado correctamente 0c0000000142"

Gracias

JuanErasmo 27-03-2009 17:49:45

Cuando le doy click derecho ejecutar como... y selecciono el administrador, si funciona bien,

se me ocurre entonces, crear un ejecutable que llame al programa principal, pero que por código, le pase los parámetros de "ejecutar como..." para que el usuario no tenga que conocer las contraseñas de administrador, sino que estas esten includias como parámetro de un ShellExecute o algo asi,,,,,
es posible hacerlo???


Gracias.

ContraVeneno 27-03-2009 18:12:43

¿dónde escribe la función "LogAgregar"?, ¿en un archivo?, ¿en el registro?

JuanErasmo 27-03-2009 20:59:56

En la funcion se le cambia el separador de fecha
tiene algo que ver?

JuanErasmo 27-03-2009 23:57:15

La aplicación utiliza MDIForms, es decir, child forms.
tiene algo que ver?
gracias

cHackAll 28-03-2009 00:31:42

JuanErasmo, es dificil acertar en la causa con los datos que nos das, se me ocurre que podria suceder por codigo no escrito por ti. Lo que te aconsejo es ir comentando trozos de codigo, funciones, etc... asi con prueba & error encontraras la causa.

JuanErasmo 28-03-2009 16:12:42

CUando la aplicación en el main dice:
Código:

Application->Initialize();
que es lo que exactamente hace? donde lee? donde escribe,,,,?

Gracias

ContraVeneno 28-03-2009 16:28:39

Lo único que podría adivinar, es que tienes la aplicación en un directorio no accesible para usuarios normales... Intenta ponerla en algún lugar como "Documents and settgins\All users" o una carpeta así que sea accesible para todos.

JuanErasmo 28-03-2009 18:58:46

Revisando todas los .cpp y los .h, encuentro que dentro del código, en una de las clases hay uno que no me deja ver el Form, y dice:

Class TLFile not found Ignore the error and coninue?
NOTE: ignoring the error may cause components to be deleted or property values to be lost.


tiene algo que ver????

Muchas gracias.

mamcx 28-03-2009 19:06:44

Para saber como hacer aplicaciones que funcionen 100% correcto en la plataforma de Windows, es bueno revisar lo que el propio MS dice en su programa "Certificado para windows".

Un documento de base se puede ver en:

http://ampalliance.org/blogs/microso...uirements.aspx

La realidad es que muchos desarrolladores ignoran que MS publica las mejores practicas de desarrollo para su plataforma y que el no seguirlas es por mucho una de las causas principales de lios, inestabilidad del sistema, problemas de seguridad y demas.

Algo adicional para chequear: Nunca, pero nunca jamas, escribas en archivos dentro de "Program Files", esa es una carpeta privilegiada y mucho mas en Vista/Windows 7...

mamcx 28-03-2009 19:07:45

Aparte de todo, deberias hacer las cosas al derecho y no adivinando. Depuracion Voodo es de lo peor ;)

Simplemente, ejecuta Delphi con un usuario restringido, y depura hasta que encuentres.

JuanErasmo 28-03-2009 19:20:28

Gracias por el consejo :D lo voy a intentar asi.

JuanErasmo 29-03-2009 17:58:58

Ya lo tengo en el depurador, pero no me ayuda para nada,,,,,

me aparecen unos códigos en assembler, lenguaje de bajo nivel, pero no me da pistas de cual es el unit que esta causando el error......


como puedo depurarlo para que me lleve a la linea de código exacta?

Gracias!

mamcx 30-03-2009 17:17:54

Mira el stack trace hasta que muestre una linea de codigo tuya.

Ahora bien, debiste ver con claridad en que linea saco el error, si es que emepezaste desde el unit del proyecto.

Si en ninguno de esos lados esta, quizas es una DLL o una VCl o un OCX que esta generando la excepcion... cargas algo diferente a las VCL normales, incluidas en delphi?

ContraVeneno 30-03-2009 17:22:08

solo quedaría probar, crear una nueva aplicación desde cero y poco a poco ir agregándole las cosas que tienes en tu proyecto hasta ver cuál es la que te genera ese problema.

JuanErasmo 30-03-2009 18:53:42

es muy grande la aplicacion , lo hice el fin de semana y llego al mismo error.
debe ser algun ocx lo que hé visto en el depurador es un ntdll o algo asi, pero no me ha llevado a la linea de codigo o al nombre de la clase culpable de este desastre´...

gracias

JuanErasmo 01-04-2009 01:42:42

Solucionado, Muchas Gracias
 
Bueno, para los que les pueda ocurrir este molesto error, la aplicacion no se ha inicializado correctamente 0xc0000142, aqui esta el problema y la solución!!!!!


El problema: Normalmente las aplicaciones utilizan dll que se cargan antes de iniciar cualquier linea de código que tu escribiste,,,,,, si hay alguna dll corrupta, esto ocasionará que tu aplicación genere este molesto mensaje.

Solución: reemplaza dll defectuosas, y si utilizas una dll que tu mismo creaste, verifica que si quede correctamente instalada en tu sistema operativo, si solo la copias y no la registras, puedes obtener este molesto mensaje ( que me llevó muchossssssss dias en resolver gracias a todos ustedes por su valiosa ayuda, se les aprecia. :D )


La franja horaria es GMT +2. Ahora son las 12:26:28.

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