 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Isa1976 Lt Cmdr


Registrado: 23 Nov 2005Mensajes: 104
|
Publicado: Vie 14 May, 2010 9:25 pm Asunto: Iniciar aplicacion con Windows para todos los usuarios |
|
|
hola a todos:
hasta ahora he utilizado este código (copiado de este foro) para iniciar aplicaciones:
| Código: | TRegistry *R = new TRegistry;
R->RootKey = HKEY_LOCAL_MACHINE;
if (R->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true))
R->WriteString(ExtractFileName(Application->ExeName), Application->ExeName+" a");
delete R; |
Lo que sucede es que solo inicia la apliación en el usuario donde se ejecutó. Cuando cambio de usuario no se ejecuta en dicho usuario.
¿Cómo puedo hacer para que se ejecute en todos los usuarios?
Gracias. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 14 May, 2010 11:08 pm Asunto: |
|
|
Pues tal como esta debería funcionar en Windows XP y anteriores si el usuario tiene privilegios de administrador..
Prueba esta versión:
https://cppbuilder.es/viewtopic.php?p=40355 |
|
| Volver arriba |
|
 |
Isa1976 Lt Cmdr


Registrado: 23 Nov 2005Mensajes: 104
|
Publicado: Mar 18 May, 2010 8:05 pm Asunto: |
|
|
Gracias por responder _Leo:
amplio un poco más el asunto:
Tengo dos usuarios, user1 y user2. Mi aplicación se ejecuta al iniciar el sistema ya sea con el 1 o el 2. Una vez que el sistema se ha iniciado (por ejemplo con user1), se puede cambiar de usuario (sin reiniciar) lo que hace que mi aplicación siga ejecutándose en el user1, pero en el user2 también se está ejecutando, ya que se puede acceder al programa.
La idea es poder hacer que mi aplicación sepa cuando está con cada usuario, de esta manera pueda decidir que hacer con cada usuario.
Asi puedo ejecutar la aplicación solo para un usuario, ya que no me interesa tener la aplicacion corriendo en dos usuarios a la vez.
Como puedo saber si se ha cambiado de usuario?
Muchas gracias de antemano. |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Jue 20 May, 2010 1:58 am Asunto: |
|
|
La solución la puedes tener en los archivos *.INI privados a nivel de directorio en la ubicación de tu aplicación.
Cuando un USUARIO inicia tu aplicación escribes en el fichero *.INI que un usuario está utilizando tu aplicación, ejemplo:
| Código: |
Users.ini //Nombre de fichero .ini
[Ejecución de Usuarios] //Sección
Usuarios conectador: 1 // Valores de Sección
|
Haces que si sales de la aplicación este valor se ponga a CERO.
Implementa la forma de que al iniciar la aplicación se lea este valor del *.INI y si Valor > CERO, deniegas el acceso. También deberías de implementar que ante cualquier excepción o salida incontrolada del programa este valor se ponga a CERO.
También tienes que controlar que cuando inicias tu aplicación el fichero *.INI debe de existir.
Por supuesto el fichero *.INI tienes que encriptarlo de alguna forma para que sea ilegible.
Si el directorio donde se encuentra tu aplicación no es privado a nivel de usuario esta forma debería funcionar sin problemas. Con ello podrías controlar incluso cuantos usuarios permites que ejecuten tu aplicación al mismo tiempo.
Espero que te sirva de algo esta sugerencia o que por lo menos te dé una idea de cómo podrías implementarlo.
También podrías utilizar un campo de la misma base de datos de tu aplicación para guardar esta información, si es que no te convence lo de los *.INI. _________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 20 May, 2010 11:55 pm Asunto: |
|
|
| Isa1976 escribió: | | amplio un poco más el asunto: |
No te había entendido bien...
| Isa1976 escribió: | | Asi puedo ejecutar la aplicación solo para un usuario, ya que no me interesa tener la aplicacion corriendo en dos usuarios a la vez. |
Si lo único que necesitas realmente es que solo se pueda ejecutar una instancia de tu aplicación (incluso que no permita abrirlo a la vez en otra sesión). Solo tendrías que cambiar en el "WinMain" esto:
| Código: | try
{
// "MyMutex" debe ser un nombre unico para tu programa
// (no debe haber dos ejecutables con el mismo)
// Y la parte que pone "Global\\" es la que hace que funcione en las distintas sesiones
CreateMutex(0, 0, TEXT("Global\\MyMutex"));
if (GetLastError())
{
MessageBox(Application->Handle, TEXT("El programa ya se está")
TEXT("ejecutando (en esta u otra sesión)"), TEXT("¡Aviso!"), 0);
}
else
{
// Aqui ponemos lo que estaba originalmente dentro del primer "try"
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
} |
| Isa1976 escribió: | | Como puedo saber si se ha cambiado de usuario |
Y si lo que quieres saber es cuando se cambia de sesión, tienes la función del API: "WTSRegisterSessionNotification". Un ejemplo de como usarla:
- Pondríamos lo siguiente en el constructor del Form principal, para indicar que queremos recibir notificaciones de los cambios de sesión:
| Código: | WTSRegisterSessionNotification(Handle, NOTIFY_FOR_THIS_SESSION);
//O: WTSRegisterSessionNotification(Handle, NOTIFY_FOR_ALL_SESSIONS); |
- Lo siguiente en el destructor:
| Código: | WTSUnRegisterSessionNotification(Handle); |
- En la cabecera del Form principal, bajo el apartado privado:
| Código: | private: // User declarations
MESSAGE void __fastcall SessionChange(TMessage& msg);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_WTSSESSION_CHANGE, TMessage, SessionChange);
END_MESSAGE_MAP(inherited); |
- Y en el .cpp lo implementamos:
| Código: | void __fastcall TForm1::SessionChange(TMessage& msg)
{
// Aquí recibiremos las distintas notificaciones que se muestran más abajo
// (más detalles de cada una de ellas en la referencia del API)
String str[10] = { "NULL", "WTS_CONSOLE_CONNECT", "WTS_CONSOLE_DISCONNECT",
"WTS_REMOTE_CONNECT", "WTS_REMOTE_DISCONNECT", "WTS_SESSION_LOGON",
"WTS_SESSION_LOGOFF", "WTS_SESSION_LOCK", "WTS_SESSION_UNLOCK" };
"WTS_SESSION_REMOTE_CONTROL";
Memo1->Lines->Add((msg.WParam < 10) ? str[msg.WParam] : String(msg.WParam));
} |
- Y además añadimos lo siguiente al principio del .cpp (antes del #include<vcl.h>) (En la versión 6, en las superiores no hace falta tanto lio):
| Código: | #define OLD_WIN32_WINNT _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <wtsapi32.h>
#pragma link "WtsApi32.lib"
#undef _WIN32_WINNT
#define _WIN32_WINNT OLD_WIN32_WINNT |
- Finalmente, en las opciones del proyecto:
MENU: Project -> Options... -> Pestaña: "Directories/Conditionals" -> COMBO: "Library path"
Añadimos la siguiente ruta:
$(BCB)\lib\PSDK |
|
| Volver arriba |
|
 |
juanma Cmdr

Registrado: 17 Nov 2005Mensajes: 127Ubicación: Almeria - España
|
Publicado: Vie 21 May, 2010 9:41 am Asunto: |
|
|
Esto no tiene que ver con el problema de Isa que me parece que leo ha solucionado con el mutex.
En realidad es para prevenir o al menos avisar que la solucion que propone Jesus tiene el inconveninte de que un cuelgue del ordenador o un corte de luz donde el programa no resetea el valor, luego hace imposible arrancar el programa salvo que se tenga a mano a alguien que controle el funcionamiento (no quiero quitar que sea una solucion ingeniosa para algunas cosas, solo poner en conocimiento los efectos secundarios).
Saludos,
Juanma |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|