Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: anonimo12121 en 25 Marzo 2013, 23:26 PM

Título: Como se abre 2 terminales en un programa [windows] ?
Publicado por: anonimo12121 en 25 Marzo 2013, 23:26 PM
Como se abre 2 terminales en un programa [windows]?
Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: avesudra en 25 Marzo 2013, 23:32 PM
Quizás con:
system("start cmd");
Obviamente no vas a poder trabajar mucho con ella...
Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: anonimo12121 en 25 Marzo 2013, 23:50 PM
Cita de: avesudra en 25 Marzo 2013, 23:32 PM
Quizás con:
system("start cmd");
Obviamente no vas a poder trabajar mucho con ella...
esa no es la idea, lo que quiero es poder manejar 2 terminales una para recibir datos y otra para enviar...

xDD
Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: avesudra en 26 Marzo 2013, 00:15 AM
Quizás este enlace te sirva:

http://forums.codeguru.com/showthread.php?302501-Processes-How-can-I-start-a-process
Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: anonimo12121 en 26 Marzo 2013, 13:16 PM
Eso serviría si supiera como poner la terminal que abro, como la que se ejecuta al compilar que recibe datos de cout .

Creo que ahora me puedes a ver entendido mejor.
Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: avesudra en 26 Marzo 2013, 13:32 PM
Sí si te he entendido perfectamente ahora, pues lo que se me ocurre es que crees dos procesos con CreateProcess y mediante Pipes te comuniques con el stdout de una terminal y el stdin de otra. Te dejo unos enlaces:

http://msdn.microsoft.com/en-us/library/ms682512%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365603%28v=vs.85%29.aspx

Otro enlace que tiene mejor pinta:

http://tenouk.com/cpluscodesnippet/pipeandchildprocess.html

Un código para abrir una cmd nueva, ya solo nos falta comunicarnos por ella mediante Pipes:
#include <windows.h>
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
   printf("Window A\n");

   STARTUPINFO          si = { sizeof(si) };
   PROCESS_INFORMATION  pi;
   TCHAR               szExe[] = _T("cmd.exe"); // <-- Could be any program

   if(CreateProcess(0, szExe, 0, 0, FALSE, CREATE_NEW_CONSOLE, 0, 0, &si, &pi))
   {
       // optionally wait for process to finish
       //WaitForSingleObject(pi.hProcess, INFINITE);

       CloseHandle(pi.hProcess);
       CloseHandle(pi.hThread);
   }
   return 0;
}
Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: anonimo12121 en 26 Marzo 2013, 14:08 PM
Gracias Avesudra  voy a mirar la info pasada.

EDIT: LOL que engorroso es...
Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: daryo en 26 Marzo 2013, 14:27 PM
en este programa hace falta las pipes  :-X para manejar el proceso en si



http://msdn.microsoft.com/en-us/library/windows/desktop/aa365780%28v=vs.85%29.aspx


http://blog.hernanjlarrea.com.ar/index.php/qu-es-un-named-pipe/ ejemplo en c# pero al menos explica mas o menos que es eso
Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: avesudra en 26 Marzo 2013, 16:32 PM
Voy a aclarar las cosas porque yo me creía que con las pipes podía manejar cualquier proceso y no es así. Las pipes sirven para comunicar dos procesos, uno de ellos es el cliente, y otro el servidor. Lo que pasa es que hay que crear dos programas uno que mande datos por un pipe(servidor) y otro que lea datos por ese pipe y los muestre ( el cliente,una especie de stdout personalizado). Y para el de la entrada pues lo mismo. Por lo tanto los programas deben tener esto:

Servidor


Cliente




Así que ya sabes lo que tienes que hacer, no sé si hay una manera más fácil pero bueno no está mal aprender esto. Aquí te dejo un ejemplo de servidor y cliente:
Servidor:
///// SERVER PROGRAM /////

#include <iostream>
#include <windows.h>
using namespace std;

int main(int argc, const char **argv)
{
wcout << "Creating an instance of a named pipe..." << endl;

// Create a pipe to send data
HANDLE pipe = CreateNamedPipe(
L"\\\\.\\pipe\\my_pipe", // name of the pipe
PIPE_ACCESS_OUTBOUND, // 1-way pipe -- send only
PIPE_TYPE_BYTE, // send data as a byte stream
1, // only allow 1 instance of this pipe
0, // no outbound buffer
0, // no inbound buffer
0, // use default wait time
NULL // use default security attributes
);

if (pipe == NULL || pipe == INVALID_HANDLE_VALUE) {
wcout << "Failed to create outbound pipe instance.";
// look up error code here using GetLastError()
system("pause");
return 1;
}

wcout << "Waiting for a client to connect to the pipe..." << endl;

// This call blocks until a client process connects to the pipe
BOOL result = ConnectNamedPipe(pipe, NULL);
if (!result) {
wcout << "Failed to make connection on named pipe." << endl;
// look up error code here using GetLastError()
CloseHandle(pipe); // close the pipe
system("pause");
return 1;
}

wcout << "Sending data to pipe..." << endl;

// This call blocks until a client process reads all the data
const wchar_t *data = L"*** Hello Pipe World ***";
DWORD numBytesWritten = 0;
result = WriteFile(
pipe, // handle to our outbound pipe
data, // data to send
wcslen(data) * sizeof(wchar_t), // length of data to send (bytes)
&numBytesWritten, // will store actual amount of data sent
NULL // not using overlapped IO
);


if (result) {
wcout << "Number of bytes sent: " << numBytesWritten << endl;
} else {
wcout << "Failed to send data." << endl;
// look up error code here using GetLastError()
}

// Close the pipe (automatically disconnects client too)
CloseHandle(pipe);

wcout << "Done." << endl;

system("pause");
return 0;
}

Cliente:
///// CLIENT PROGRAM /////

#include <iostream>
#include <windows.h>
using namespace std;

int main(int argc, const char **argv)
{
wcout << "Connecting to pipe..." << endl;

// Open the named pipe
// Most of these parameters aren't very relevant for pipes.
HANDLE pipe = CreateFile(
L"\\\\.\\pipe\\my_pipe",
GENERIC_READ, // only need read access
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);

if (pipe == INVALID_HANDLE_VALUE) {
wcout << "Failed to connect to pipe." << endl;
// look up error code here using GetLastError()
system("pause");
return 1;
}

wcout << "Reading data from pipe..." << endl;

// The read operation will block until there is data to read
wchar_t buffer[128];
DWORD numBytesRead = 0;
BOOL result = ReadFile(
pipe,
buffer, // the data from the pipe will be put here
127 * sizeof(wchar_t), // number of bytes allocated
&numBytesRead, // this will store number of bytes actually read
NULL // not using overlapped IO
);

if (result) {
buffer[numBytesRead / sizeof(wchar_t)] = '\0'; // null terminate the string
wcout << "Number of bytes read: " << numBytesRead << endl;
wcout << "Message: " << buffer << endl;
} else {
wcout << "Failed to read data from the pipe." << endl;
}

// Close our pipe handle
CloseHandle(pipe);

wcout << "Done." << endl;

system("pause");
return 0;
}


Este código y la info la he sacado de http://avid-insight.co.uk/joomla/component/k2/item/589-introduction-to-win32-named-pipes-cpp

P.D: Creo que estoy en lo cierto, si algún usuario cree que no que lo diga.
Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: 85 en 26 Marzo 2013, 23:00 PM
disculpen no he leído todo el topic detenidamente (Estoy perezoso XD), pero no será que necesita crear una ventana de consola, algo así


AllocConsole();  // Create Console Window
freopen("CONIN$","rb",stdin);   // reopen stdin handle as console window input
freopen("CONOUT$","wb",stdout);  // reopen stout handle as console window output
freopen("CONOUT$","wb",stderr); // reopen stderr handle as console window output

... código

FreeConsole();  // Free Console Window


Porque leí algo de crear otro proceso, etc pero a juzgar por el título...
aunque yo para lo que usé este código fue para crear una ventana de consola en una aplicación win32, para ingresar unos datos por consola y luego cerrarla.

Saludos

Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: daryo en 27 Marzo 2013, 13:51 PM
@avesudra si el programa a manejar es de tipo consonla como cmd o un comando entonces es posible manejarlo con pipes.
Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: avesudra en 27 Marzo 2013, 13:57 PM
Cita de: daryo en 27 Marzo 2013, 13:51 PM
@avesudra si el programa a manejar es de tipo consonla como cmd o un comando entonces es posible manejarlo con pipes.
¿Pero ese programa necesita saber a que pipe conectarse no? No sé, perdonad por la ignorancia...
Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: daryo en 27 Marzo 2013, 14:03 PM
tambien tiene las pipes anonimas podrias buscar sobre shells remotas seguramente la mayoria usa pipes si quieres un ejemplo .

aca encontre una no es mia ni nada jeje asi que los creditos a su autor http://www.rohitab.com/discuss/topic/27868-remote-shell/
Título: Re: Como se abre 2 terminales en un programa [windows] ?
Publicado por: fary en 29 Marzo 2013, 19:25 PM
Con pipes como ya te dijeron es como se hace.