Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - amchacon

#811
Lamento decírtelo, pero has incumplido tu propia condición. El programa no estaba bloqueado porque como tu mismo dijiste, no funciona si se ejecuta dentro del IDE ya que se ejecuta sin privilegios de administrador.

Voy ha hacer una retruscturación del código:

Código (cpp) [Seleccionar]
/* nota para que funcione correctamente se debe ejecutar desde fuera de un ide */
#include <windows.h>
#include <stdio.h>


int main()
{
   // Abro el archivo, no permito otros accesos de lectura/escritura/borrado

   HANDLE Lectura = CreateFileA("programa.exe", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);

   if (Lectura == INVALID_HANDLE_VALUE)
   {
       printf("No se pudo bloquear el programa");
       return 1;
   }

   Sleep(30000); // Duemo 30 segundos

   return 0;
}


Ahora en caso de que no se pueda bloquear (ya sea porque otro proceso lo esté usando o por falta de permisos) devolverá un mensaje de error.
#812
Cita de: daryo en 10 Junio 2013, 00:12 AM
algunas pruebas con tu programa  y comento por aca a ver que tal :D
Recuerda que createfile devuelve un HANDLE, si este HANDLE no tiene un valor válido significaría que no se ha podido realizar la operación.

Lo digo porque decías que "LOCKFILE_EXCLUSIVE_LOCK devuelve un booleano en caso de fallo".
#813
Cita de: aguml en  9 Junio 2013, 23:35 PM
¿createfile para ver si se esta ejecutando un proceso? ¿Pero eso lo que haria no seria crear un archivo o abrirlo y darnos el handle?
Sí, pero createfile nos permite poner políticas a la hora de compartir el archivo. Podemos compartir la lectura, la escritura y los borrados.

En este caso no comparto nada, como no puedes leer el archivo no lo puedes ejecutar.

Cita de: daryo en  9 Junio 2013, 23:56 PM
si todo eso lo se , pero tu programa no funcionaria como deberia porque con LockFileEx bloqueo el acceso a los demas programas  y no solo en escritura como es lo comun sino tambien en lectura con el parametro LOCKFILE_EXCLUSIVE_LOCK  y de paso devuelve un booleano y en caso de no poderse bloquear pues otro proceso lo tiene abierto.
Con mi programa también bloqueo el acceso a las demás aplicaciones (¿Como vas a ejecutar un archivo que no puedes leer?).

Cita de: daryo en  9 Junio 2013, 23:56 PM
lo del main no funcionaria porque en caso de que el programa tenga otra ubicacion se bloquearia a si mismo y el otro programa tambien se bloquearia a si mismo pero eso significaria  que tendria por cada copia del programa una posibilidad de ejecucion.
Claro, la idea esque el programa se bloquee a sí mismo. Y luego cuando lo considere oportuno se desbloquee por su cuenta.
#814
Cita de: leosansan en  9 Junio 2013, 20:41 PMP.D: Por cierto, "-fpermissive" con una o dos "s".
Con 2 ss como dice el error:

Código (cpp) [Seleccionar]
error: invalid conversion from 'void*' to 'char*' [-fpermissive]|

¿Puse 1s? Me cachis  :rolleyes:

Cita de: leosansan en  9 Junio 2013, 20:41 PMMe ha quedado clarito, clarito. Thanks!.



#815
Cita de: leosansan en  9 Junio 2013, 20:07 PM¿Podrías explicarme brevemente que es eso del "C++ estricto?.
El termino no es oficial, me lo acabo de inventar yo.

Según el estándar de C++, hay algunas operaciones que no están permitidas porque se consideran ambiguas. Sin embargo, Mingw permite usar el flag "-fpermisive" por lo cual puede digerir esas operaciones.

En este caso, supongo que mingw hará un cast implícito a (char*). Según el estándar tendrías que hacer un cast explícito, tal y como lo he puesto ahí.

PD: Esa solución me ha matado  :o

Que fea es  ;-)
#816
Código (cpp) [Seleccionar]
error: invalid conversion from 'void*' to 'char*' [-fpermissive]|
Esto es porque realloc devuelve void* y no char*. El compilador no te lo permite porque estás usando un C++ estricto.

Puedes hacer un cast a char*:

Código (cpp) [Seleccionar]
(aux = (char*)realloc(palabra, (i + 10) * sizeof *palabra)) == NULL)

La opción 2 es desactivar el C++ estricto:



Otro error que tienes es que vas a aumentando elrealloc de 10 en 10. Esto estaría correcto si no lo hicieras en cada iteración del bucle. La idea es ahorrarse reallocs pero estás haciendo los mismos y reservando x10 memoria.

Otro error más es que intentas mostrar la palabra antes de haber puesto el caracter nulo. Por último se te han olvidado parentesís en el while. Corregidos esos errores:

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>

using namespace std;
int main(void)
{
   char *palabra=NULL,*aux,palabra2[]="qw";
   int ch;
   int i=0;
   i = 0;

   while ((ch = cin.get()) != '\n')
   {
       if ((aux = (char*)realloc(palabra, (i+1) * sizeof *palabra)) == NULL)
       {
           cout<<"No hay espacio en memoria"<<endl;
           free(palabra);
           return 1;
       }
       palabra = aux;
       palabra[i++] = ch;
   }

   palabra[i++] = '\0';
   for (i = 0; palabra[i] != '\0'; i++)
       if (palabra[i] != palabra2[i])
           break;
  // if (i==2)
       cout<<palabra<<endl;
   cin.get();
   return 0;
}


Y aplicado a mi antiguo código con el ajuste "amortiguado" de realloc:

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>

using namespace std;

const int INTERVALO_REALLOC = 5;

int main(void)
{
   char *palabra,*aux,palabra2[]="qw";
   int ch;
   int i=0,j=0;
   int ultimorealloc = 0;
   palabra = NULL;

   aux = new char[INTERVALO_REALLOC];

   while ((ch = cin.get()) != '\n')
  {
       if ((i-ultimorealloc) == INTERVALO_REALLOC)
       {
           ultimorealloc = i;

           if ((aux = (char*)realloc(palabra, (i + INTERVALO_REALLOC) * sizeof *palabra)) == NULL){
               cerr<<"No hay espacio en memoria\n";
               delete[] palabra;
               return 1;
           }

       }
       palabra = aux;
       palabra[i++] = ch;
   }
   palabra[i++] = '\0';
   cout<<palabra<<endl;
   for (i = 0; palabra[i] != '\0'; i++)
   if (palabra[i] != palabra2[i])
     break;
   if (i==2)
       cout<<"Hola mundo\n";

   cout<<palabra;
//cin.get();
  return 0;
}
#817
No es más fácil:

/* nota para que funcione correctamente se debe ejecutar desde fuera de un ide */
#include <windows.h>
#include <stdio.h>


int main()
{
   // Abro el archivo, no permito otros accesos de lectura/escritura/borrado

   CreateFileA("programa.exe", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
 
   Sleep(10000); // Duemo 10 segundos

   return 0;
}


Por cierto la ruta del programa se le pasa como argumento al main. Puedes intentar obtener el nombre del programa ahí  ;)
#818
Esos son para mandarle señales a Threads...

Por si acaso: ¿Tienes experiencia con wxWidgets? Porque si eres novato yo no empezaría por ahí:
http://zetcode.com/gui/wxwidgets/
#819
Cita de: leosansan en  9 Junio 2013, 18:24 PM
No sé si te has fijado que has respondido a mi primer post de la página anterior, al cual ya respondí.

Me gustaría tu opinión resecto al segundo código que propuse en C y su portabilidad a C++. Me da error en C++ el uso de realloc. "I don´t know".

Saluditos! .... ..


Realloc debería funcionar en C++ perfectamente, debe ser otro fallo.

Ponnos el código aquí para que podamos opinar  :rolleyes:
#820
Rit estaba contestando a Leo no a ti.