Hi Fan,

Thanks! Your code works. A further question: How can I hide this console
window?

Actually these days I can spawn bash and read stdout by using
CreateProcess() and pipes, and I can hide the console window of bash by
setting a flag in an argument to CreateProcess().

Thanks
Gang

2015-09-29 13:43 GMT+08:00 Fan, Chun-wei (范君維) <fanc...@yahoo.com.tw>:

> Hi Gang,
>
> You can take a look at https://support.microsoft.com/en-US/kb/105305.
> Basically, you need to have a console attached to the GUI app for your case
> to work.
>
> By running your code, and by adding AllocConsole() just before you spawn
> the subprocess, I was able to get the output.
>
> Hope this helps.  With blessings.
>
>
>
> Gang Chen 於 2015/9/28 上午 10:01 寫道:
>
>>
>> Hi,
>> I'm writing a GTK+ application with MINGW-W64, which spawns a subprocess
>> running bash to execute some commands with GSubprocess and reads stdout of
>> bash (installed from MSYS2). I found that if compiled without "-mwindows"
>> compilation option the main process can read the stdout, while with
>> "-mwindows", the read function always returns 0 bytes read. If the main
>> process runs a normal console program, or like "mingw32/bin/gcc.exe", then
>> it can read stdout even if compiled with "-mwindows".
>> The code:
>>
>> #include  <glib.h>
>> #include  <gio/gio.h>
>> #include  <gtk/gtk.h>
>> #include  <stdio.h>
>>
>> char  buffer[100];
>> GtkTextView *text;
>>
>> void  ondataread(GObject *s, GAsyncResult *r, gpointer p)
>> {
>>      GError *error =NULL;
>>      int  l =g_input_stream_read_finish(G_INPUT_STREAM(s), r, &error);
>>      if  (error)
>>          printf("read error: %s\n", error->message);
>>      else  if  (l >0)
>>      {
>>          gtk_text_buffer_insert_at_cursor(gtk_text_view_get_buffer(text),
>> buffer, l);
>>          g_input_stream_read_async(G_INPUT_STREAM(s), buffer,100,
>> G_PRIORITY_DEFAULT,NULL, ondataread,NULL);
>>      }
>> }
>>
>> int  main(int  argc,char  **argv)
>> {
>>      char  *subpargv[8] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL  };
>> subpargv[0] = "D:\\msys64\\usr\\bin\\bash.exe";
>> subpargv[1] = "-c";
>> subpargv[2] = "echo good; sleep 10; pwd";
>> // subpargv[0] = "C:\\Windows\\system32\\cmd.exe";
>> // subpargv[1] = "/c";
>> // subpargv[2] = "echo good";
>> // subpargv[0] = "D:\\msys64\\mingw32\\bin\\gcc.exe";
>> // subpargv[1] = "notfile";
>>      GSubprocessLauncher *l
>> =g_subprocess_launcher_new(G_SUBPROCESS_FLAGS_STDOUT_PIPE |
>> G_SUBPROCESS_FLAGS_STDERR_PIPE);
>>      GError *error =NULL;
>>      GSubprocess *p =g_subprocess_launcher_spawnv(l, subpargv, &error);
>>      if  (!p)
>>      {
>>          printf("spawn error: %s\n", error->message);
>>          return  -1;
>>      }
>>      g_object_unref(l);
>>      g_input_stream_read_async(g_subprocess_get_stdout_pipe(p),
>> buffer,100, G_PRIORITY_DEFAULT,NULL, ondataread,NULL);
>>      g_input_stream_read_async(g_subprocess_get_stderr_pipe(p),
>> buffer,100, G_PRIORITY_DEFAULT,NULL, ondataread,NULL);
>>      gtk_init(&argc, &argv);
>>      GtkWidget *win =gtk_window_new(GTK_WINDOW_TOPLEVEL);
>>      GtkWidget *t =gtk_text_view_new();
>>      gtk_container_add(GTK_CONTAINER(win), t);
>>      text =GTK_TEXT_VIEW(t);
>>      gtk_widget_show_all(win);
>>      gtk_main();
>>      return  0;
>> }
>>
>> How to read stdout correctly?
>> Thanks,
>> Gang
>>
>>
>>
>> _______________________________________________
>> gtk-list mailing list
>> gtk-list@gnome.org
>> https://mail.gnome.org/mailman/listinfo/gtk-list
>>
>
>
_______________________________________________
gtk-list mailing list
gtk-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to