• Miércoles 15 de Mayo de 2024, 16:44

Mostrar Mensajes

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


Mensajes - bcasadorodriguez

Páginas: [1]
1
Visual C++ / Re: Funcion Para Obtener La Ruta De Un Archivo.
« en: Lunes 22 de Agosto de 2005, 18:56 »
No se cómo puedo buscar en todos los directorios hasta encontrar el archivo que necesito. Me podrias poner un ejemplo?. Y por cierto con lo del registro ya si que me has dejado sin palabras¿?¿?¿?
Gracias por la atencion.

2
Visual C++ / Re: Funcion Para Obtener La Ruta De Un Archivo.
« en: Lunes 22 de Agosto de 2005, 18:24 »
Lo que estoy haciendo es un módulo que me va a permitir unir dos programas. En el codigo del módulo es donde tengo la llamada al segundo programa que es el que tengo que abrir desde el módulo. Entonces, cuando tu instalas el primer programa, para poder acceder al modulo, te lo copias en el directorio de modulos del primer programa que has instalado y este asi llamara al segundo programa que puede estar instalado en cualquier otro sitio. entonces como posible solucion es tener un modulo para cada tipo de sistema operativo, pero si hubiese una funcion que me permita obtener el path, asi solo tendria que usar una unica version para cualquier version de windos.
Aun asi con el programa de Diodo no se como podria buscar en todos los directorios, ya que solo me devuelve el actual en el que me encuentro.
No se como hacerlo!! espero que podais ayudarme, muchisimas gracias.

3
Visual C++ / Re: Funcion Para Obtener La Ruta De Un Archivo.
« en: Lunes 22 de Agosto de 2005, 17:58 »
Hola Eternal idol, este programa de MSDN, busca un archivo pero solo si yo le doy la ruta completa de dónde está.
Actualmente, en el programa que estoy desarrollando, para que se me ejecute el programa que necesito abrir, tengo puesta toda la ruta completa con el nombre del archivo ejecutable. Pero mi problema es que si este programa lo quiero trasladar a otro ordenador que no tenga windows xp, sino que tenga tenga por ejemplo w98 u otro diferente, ya no se podria ejecutar porque la ruta cambiaria; Entonces, si yo quiero transportar este programa a otro ordenador con otra version de windows seria mejor obtener la ruta mediante alguna función con la que sólo con pasarle como argumento el nombre del programa funcion(word.exe), me devolviese la ruta que yo necesito. No se si me entiendes.
De todas formas, tampoco se a lo que te refieres con lo de la Api, porque nunca he usado ninguna api.
Gracias !

4
Visual C++ / Re: Funcion Para Obtener La Ruta De Un Archivo.
« en: Lunes 22 de Agosto de 2005, 17:29 »
Hola diodo.
La función me devuelve el directorio actual en el que me encuentro, pero yo necesito otra ubicación. Necesito la ruta de un programa que se encuentra en otro lugar, lugar que ni siquiera deberia saber, solo necesitaria introducir en la función que necesito el nombre del archivo ej: word.exe para que me devuelva la ruta de dónde se encuentra ese programa, para poder ejecutarlo cualquiera que sea su lugar.

5
Visual C++ / Re: Funcion Para Obtener La Ruta De Un Archivo.
« en: Lunes 22 de Agosto de 2005, 16:57 »
Me podrias poner un ejemplo de cómo obtener la ruta de un programa, por ejemplo word??
Gracias.

6
Visual C++ / Re: Funcion Para Obtener La Ruta De Un Archivo.
« en: Lunes 22 de Agosto de 2005, 16:18 »
Hola,
Tengo que ejecutar un programa, y para ello debo poner la ruta absoluta de dónde se encuentra, pero todo eso depende del sistema operativo, ya que si llevo este codigo a windows 98 ya no me encontraria en ese directorio el programa. Entonces querria una funcion a la que si le doy el nombre de un programa (nombre.exe) me buscase ese archivo.
No se si me entiendes.
gracias.

7
Visual C++ / Funcion Para Obtener La Ruta De Un Archivo.
« en: Lunes 22 de Agosto de 2005, 14:48 »
Hola, me gustaria saber si existe alguna función a la que le pase como argumento el nombre de un archivo (archivo.exe) y me de la ruta completa de dónde se encuentra.
Gracias!!.

8
Visual C++ / Re: Rutinas En Visual C++
« en: Lunes 22 de Agosto de 2005, 12:09 »
Perdón por la confusión al explicarme. A ver, ya he conseguido lo que queria, las pipes me funcionan perfectamente, el problema es que esta parte del código la tengo que insertar en otro código que es un módulo para que el primer programa que es el que llama al segundo lo entienda. Ahora bien, cuando ejecuto el programa singular.exe con este código me funciona aparentemente bien, excepto cuando tiene que leer varias líneas al hacer get() pero cuando lo inserto en el módulo, al leer se me queda como bloqueado. Si no teneis el programa singular lo podeis simular con el ejecutable de cat. No sé porque no funciona cuando lo introduzco en el módulo, a ver si teneis alguna solución y sobre todo , porque no me funciona cuando intento leer varias lineas??
Espero haberme explicado bien. ahi os dejo el código.


#include "stdafx.h"

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <Windows.h>

#define PIPE_READ  0
#define PIPE_WRITE 1
#define MAXMESG    0x1000
#define _pipe(phandles) _pipe(phandles,MAXMESG,O_TEXT)

int p1[2] ;  // pipe1
int p2[2] ;  // pipe2
int m_in ;  
int m_out ;
int state;
int endstate;
char prog[] = "Singular.exe" ;
int fd1,fd2;

//*****************************************************************************
//*  my error
//*
//*****************************************************************************
void myerror(int errorCode)
{
   fprintf(stderr, "Return with error code %d\n", errorCode) ;
   fprintf(stderr, "Errno: %d\n", errno) ;
   exit(errorCode) ;
}

//*****************************************************************************
//*  put
//*
//*****************************************************************************

void put(int fd)
{
   //char buf[256];
  //fprintf(stderr, "type some Singular code :\n");
  //fflush(stderr);
  //gets(buf);
  //buf[sizeof(buf)] =  '\n' ;
  //buf[sizeof(buf)+1] =  '\0' ;
  //int bytes = write(fd,buf,sizeof(buf));
  int bytes = write(fd,"4+5;\n",sizeof("4+5);\n"));
 
  //write(fd,"\n", sizeof("\n"));
  fprintf(stderr, "to singular is : 4+5;", bytes);
  fflush(stderr);  

}
/*
void put(int fd)
{
  write(fd,"4+5;\n",strlen("4+5;\n"));   
  fprintf(stderr, "to singular is : %s \n","4+5; \n");
  fflush(stderr);  

}
*/

//*****************************************************************************
//* get
//*
//*****************************************************************************

void get (int fd)
{
  char buf[60000];
  int bytes = read ( fd, buf,sizeof(buf));
  buf[bytes] = '\0' ;
  fprintf(stderr, "from singular is : %s \n",buf);
  fflush(stderr);
  //Sleep(3000);
  //bytes = read ( fd, buf,sizeof(buf));
  //fprintf(stderr, "from singular is : %s  %d\n",buf, bytes);
  //fflush(stderr);
}
/*
void get (int fd)
{
  char buf[60000];
  read ( fd, buf,sizeof(buf));
  fprintf(stderr, "from singular is : %s \n",buf);
  fflush(stderr);
}
*/

//*****************************************************************************
//*  main
//*
//*****************************************************************************
int main(int argc, char* argv[])
{
   

   fprintf(stderr, "Starting slave program ....\n");
  fflush(stderr);

   char otherProgramm[] = "Singular.exe";

  //*create two pipes p1 and p2, return true if the pipes could not be created.
  //if( _pipe(p1,256,O_TEXT || _pipe(p2,256,O_TEXT)
  if( _pipe(p1)==-1 || _pipe(p2)==-1 )
  {
    perror("pipe failed") ;
  }


  /*close(0);
  dup2(p2[PIPE_READ],0);
  close(1);
  dup2(p1[PIPE_WRITE],1);*/


  //char rpipe[20];
  //char wpipe[20];
 
 // Convert read side of pipe to string and pass as an argument to the child process. in spawnl function
 // itoa( p1[PIPE_READ], rpipe, 10 );

  // Convert read side of pipe to string and pass as an argument to the child process. in spawnl function
  //itoa( p2[PIPE_WRITE], wpipe, 10 );


   // Preparing the redirection of stdin and stdout

   int s1, s2 ;
   s1 = dup(0) ;
   s2 = dup(1) ;

   close( 0 );                             /*** slave - stdin  ***/
   if( dup2(p1[PIPE_READ], 0) == -1 )
      myerror(4) ;

   close( 1 );                             /*** slave - stdout  ***/
   if( dup2(p2[PIPE_WRITE], 1) == -1 )
      myerror(5) ;

   /*
   close( 2 );                             // slave - stderr  
   if( dup2(fd2, 2) == -1 )
      myerror(6) ;
   */

   
   fprintf(stderr, "Starting the program singular.exe\n");
   fflush(stderr);
       
   //Sleep(10000) ;
   int pid ;
   //char buff[256]="2+3;\n";
   //pid = spawnl(_P_NOWAIT,"C:\\Archivos de programa\\bin\\cat.exe","cat.exe",NULL) ;
 
   pid = spawnl(_P_NOWAIT,"C:\\Archivos de programa\\usr\\local\\Singular\\2-0-5\\ix86-Win\\Singular.exe", prog, "-q",NULL) ;
   if ( pid == -1 )
      myerror(7) ;
   close( 0 );                             /*** slave - stdin  ***/
   if( dup2(s1, 0) == -1 )
      myerror(40) ;
   close(s1);

   close( 1 );                             /*** slave - stdout  ***/
   if( dup2(s2, 1) == -1 )
      myerror(50) ;
   close(s2);

   close(p1[PIPE_READ]);
   put(p1[PIPE_WRITE]);

   close(p2[PIPE_WRITE]);
   get(p2[PIPE_READ]);

   //sleep(5000);
   printf("This is never reached\n");
   
   

   printf("PID: %d\n", pid);
   TerminateProcess( (HANDLE) pid, 1 ) ;
   CloseHandle( (HANDLE) pid ) ;
   printf("Process %d is terminated\n", pid);
             
      return 0;
}

9
Visual C++ / Re: Rutinas En Visual C++
« en: Jueves 18 de Agosto de 2005, 14:31 »
en realidad no termina el proceso del segundo programa porque no tengo el pid para poder matarlo, en realidad el proceso que termina es el del segundo programa. Sino puedes comprobarlo en los procesos, cada vez que lo ejecutas donde se encuentran todos los procesos, aparece ese programa abierto tantas veces como ejecutes este programa. de todas formas tampoco me funciona las pipes, no sé como probarlo para ver si envia bien o no la informacion.

10
Visual C++ / Traslado De Una Funcion.
« en: Jueves 18 de Agosto de 2005, 09:09 »
como podria trasladar a w32 esta funcion:
las entradas serian:
fd --> file descriptor de un pipe pipe[READ] y las flags seria O_NONBLOCK
static int my_set_fl(int fd, int flags)
{
  int val;

if( ( val = fcntl (fd, F_GETFL, 0))<0
  return(-1);
val |= flags;
if ( ( val = fcntl (fd, F_SETFL, val))< 0)
  return ( - 1);

return(0);
}

11
Visual C++ / Re: Rutinas En Visual C++
« en: Jueves 18 de Agosto de 2005, 08:43 »
os voy a explicar lo que tengo que hacer. Debo hacer una comunicación entre dos programas mediante el uso de pipes (en este caso dos para hacer una conversion duplex hacia ambos lados), desde el primer programa haria una funcion para realizar un fork()  (en mi caso es slave.cpp) pero como bien me habeis contado, fork() no existe como tal en windows y para ello se utiliza la función spawn a la que se le pasa como parametro el nombre de otro archivo ejecutable, y los descriptores de las pipes.Una vez que se ejecuta esta funcion se crea como un proceso llamando a la otra funcion ( en mi caso muff.exe  )que es el que aproximadamente haria de hijo, y despues el hijo es el que abriría el segundo programa que quiero ejecutar. os voy a poner el código que estoy utilizando, mi problema es que me abre el segundo programa pero no consigo matar el proceso o no sé si todo el código funciona correctamente.
Espero que me entendais, sino os vuelvo a explicar.

slave.cpp
Código: Text
  1.  
  2. #include &#34;stdafx.h&#34;
  3. #include &#60;fcntl.h&#62;
  4. #include &#60;io.h&#62;  // to use _pipe function
  5. #include &#60;stdlib.h&#62; // to use itoa function.
  6. #include &#60;process.h&#62; //to use NO_WAIT argument of spawn function, execl
  7. #include &#60;Windows.h&#62;
  8.  
  9.  
  10. #define PIPE_READ  0
  11. #define PIPE_WRITE 1
  12.  
  13. int p1[2]&#59;  // pipe1
  14. int p2[2]&#59;  // pipe2
  15. int m_in&#59;  
  16. int m_out&#59;
  17. int state;
  18. int endstate;
  19.  
  20. int main(int argc, char* argv[])
  21. {
  22.  
  23.   fprintf(stderr, &#34;Starting slave program ....&#092;n&#34;);
  24.   fflush(stderr);
  25.  
  26.   char otherProgramm[] = &#34;muff.exe&#34;;
  27.  
  28.   //*create two pipes p1 and p2, return true if the pipes could not be created.
  29.  
  30.   if( _pipe(p1,256,O_TEXT)==-1 || _pipe(p2,256,O_TEXT)==-1 )
  31.   {
  32.     perror(&#34;pipe failed&#34;)&#59;
  33.   }
  34.  
  35.  
  36.   /*close(0);
  37.   dup2(p2[PIPE_READ],0);
  38.   close(1);
  39.   dup2(p1[PIPE_WRITE],1);*/
  40.  
  41.  
  42.   char rpipe[20];
  43.   char wpipe[20];
  44.  
  45.  // Convert read side of pipe to string and pass as an argument to the child process. in spawnl function
  46.   itoa( p1[PIPE_READ], rpipe, 10 );
  47.  
  48.   // Convert read side of pipe to string and pass as an argument to the child process. in spawnl function
  49.   itoa( p2[PIPE_WRITE], wpipe, 10 );
  50.  
  51.  
  52.  
  53.   // starting another program
  54.  
  55.   if( (state = spawnl(P_NOWAIT, otherProgramm, rpipe, wpipe, NULL))==-1 )
  56.   //if( (state = spawnl(P_NOWAIT, otherProgramm, otherProgramm, NULL))==-1 )
  57.   {
  58.       // error closing the pipes
  59.       close(p1[PIPE_READ])&#59;  // close 0
  60.       close(p1[PIPE_WRITE])&#59; // close 1
  61.       close(p2[PIPE_READ])&#59;  // close 0
  62.       close(p2[PIPE_WRITE])&#59; // close 1
  63.  
  64.     perror(&#34;The process can not be created....&#092;n Spawn failed&#34;);
  65.     fflush(stderr);
  66.   }
  67.  
  68.  
  69.   fprintf(stderr, &#34;creating a new process....&#092;n&#34;);
  70.   fflush(stderr);
  71.  
  72.   //assign to m_in and m_out the file descriptors of the pipe for the parent process.
  73.   m_in  = p2[PIPE_READ]&#59;
  74.   m_out = p1[PIPE_WRITE]&#59;
  75.  
  76.  
  77.    if (cwait(&endstate, state, WAIT_CHILD)== -1)
  78.   {  
  79.     perror(&#34;cwait failed&#34;);
  80.   }
  81.  
  82.  
  83.  
  84.   // close descriptors from the child process.
  85.   close(p2[PIPE_WRITE])&#59;
  86.   close(p1[PIPE_READ])&#59;
  87.  
  88.  
  89.  
  90.   TerminateProcess( (HANDLE) state, 1 )&#59;
  91.   CloseHandle( (HANDLE) state )&#59;
  92.  
  93.  
  94.   fprintf(stderr, &#34;End of slave program....&#092;n&#34;);
  95.   fflush(stderr);
  96.  
  97.   return 0;
  98. }
  99.  
  100. [color=red]
  101. muff.exe[/color]
  102.  
  103. #include &#34;stdafx.h&#34;
  104. #include &#60;stdio.h&#62;
  105. #include &#60;io.h&#62;
  106. #include &#60;process.h&#62;
  107. #include &#60;stdlib.h&#62;
  108.  
  109.  
  110. int fd1,fd2;
  111.  
  112. void error(int errorCode)
  113. {
  114.    fprintf(stderr, &#34;Return with error code %d&#092;n&#34;, errorCode)&#59;
  115.    exit(errorCode)&#59;
  116. }
  117.  
  118.  
  119. int main(int argc, char* argv[])
  120. {
  121.  
  122.  
  123.   fprintf(stderr, &#34;Starting muff program ....&#092;n&#34;);
  124.   fflush(stderr);
  125.  
  126.  
  127.         fprintf(stderr, &#34;the number of arguments are %d &#092;n&#34;,argc);
  128.     fflush(stderr);
  129.  
  130.       if (argc !=2)
  131.     {
  132.       perror(&#34;the number of arguments are &#60;&#62; 2&#34;);
  133.       exit(2);
  134.     }
  135.      
  136.            
  137.    // Preparing the redirection of stdin and stdout
  138.  
  139.      // assign the file descriptor f1 to the standar input. fd1 = p1[READ]
  140.     //close( 0 );                             /*** slave - stdin  ***/
  141.  
  142.     if(close(0) == -1 )
  143.     {
  144.       perror(&#34;can not close standard input&#34;);
  145.     }
  146.  
  147.     //sscanf(argv[0],&#34;%d&#34;,&fd1);
  148.     //dup2(fd1, 0);
  149.    
  150.     if (sscanf(argv[0],&#34;%d&#34;,&fd1) != 1)
  151.       {perror(&#34;sscanf does not work&#34;);}
  152.     if (dup2(fd1, 0)==-1){
  153.       perror(&#34;dup2 does not work&#34;);}      
  154.    
  155.   // assign the file descriptor f2 to the standar output. fd2 = p1[WRITE]
  156.     //close( 1 );                             /*** slave - stdout  ***/
  157.     if(close(1) == -1 )
  158.     {
  159.       perror(&#34;can not close standard output&#34;);
  160.     }
  161.     //sscanf(argv[1],&#34;%d&#34;,&fd2);
  162.     //dup2(fd2, 1);
  163.  
  164.     if (sscanf(argv[1],&#34;%d&#34;,&fd2) != 1)
  165.       {perror(&#34;sscanf does not work&#34;);}
  166.  
  167.     if (dup2(fd2, 1)==-1){
  168.       perror(&#34;dup2 does not work&#34;);}  
  169.  
  170.     /*
  171.   // assign the file descriptor f2 to the standar error fd2 = p1[WRITE]
  172.     close( 2 );                             // slave - stderr
  173.     if( dup2(fd2, 2) == -1 )
  174.     myerror(6)&#59;
  175.     */
  176.  
  177.        
  178.     fprintf(stderr, &#34;Starting the program Singular.exe&#092;n&#34;);
  179.     fflush(stderr);
  180.     int nexec;
  181.          
  182.     //nexec = execl(&#34;Singular.exe&#34;,&#34;Singular.exe&#34;,NULL);
  183.     nexec = execl(&#34;C:&#092;&#092;Archivos de programa&#092;&#092;usr&#092;&#092;local&#092;&#092;Singular&#092;&#092;2-0-5&#092;&#092;ix86-Win&#092;&#092;Singular.exe&#34;,&#34;Singular.exe&#34;,NULL);
  184.  
  185.     fprintf(stderr, &#34;Ending the muff program &#092;n&#34;);
  186.     fflush(stderr);
  187.    
  188.   return 0;
  189. }
  190.  
  191.  
Tengo muchos comentarios porque voy probando poquito a poco. espero que podais ayudarme.
Muchas gracias.

12
Visual C++ / Rutinas En Visual C++
« en: Miércoles 17 de Agosto de 2005, 18:55 »
Hola, necesito saber si las siguientes funciones que pongo a continuación y  que son de c++ para linux, equivalen a alguna otra en c++ para windows.
Las funciones son:

fork() --> creo que equivale a spawnl()
ioctl()
fstat()
kill() ---> para matar un proceso. no se si es igual que TerminateProcess()
wait() --> creo que equivale a cwait.
fcntl() ---> es para controlar algo de los descriptores de una pipe.

Gracias y espero que puedan ayudarme.

Páginas: [1]