Мпк::открыть3. Решение Проблемы С Stderr

Когда мы пишем графическое приложение, бывает, что нам нужно вызывать внешние программы и читать из STDOUT/STDERR. Модуль с этим прекрасно справляется МПК::Open3 .

Однако в программе, которую вы написали, все работает, но вы не хотите, чтобы пользователь (или вы) видели ненужное окно терминала.

Есть несколько вариантов скрыть это: 1. Запускать скрипт через wperl.exe, а не через perl.exe 2. ??? Давайте посмотрим на программу

 
 use strict;
 
 use Tkx;
 use IPC::Open3;
 
 my $mw = Tkx::widget->new('.

'); my $tw = $mw->new_text(); my $bt = $mw->new_ttk__button( -text => 'dir', -command => sub { my($rdr, $pid); $pid = open3( undef, $rdr, undef, 'dir' ); $tw->insert( 'end', do { local $/; <$rdr> } ); }, ); Tkx::pack( $tw ); Tkx::pack( $bt ); Tkx::MainLoop;



МПК::Открыть3. Решение проблемы с STDERR

Вызывается команда dir, и ее вывод печатается.

(игнорируйте кодировку).

Все работает, но если запустить скрипт через wperl.exe, то при вызове open3 вы получите ошибку:

 
 open3: Can't call method "close" on an undefined value at C:/perl5.8/lib/IPC/Open3.pm line 368.
 
 open3: Can't call method "close" on an undefined value at C:/perl5.8/lib/IPC/Open3.pm line 368.
 
Проблема в том, что wperl не создает стандартные ручьи (STDIN, STDOUT, STDERR).

Я долго ломал голову над тем, как заставить программу работать.

Я попробовал вызвать WINAPI внутри тела программы, запустив его через bat-файл (работает, но не со всеми программами), но решение оказалось на удивление простым.

Вы должны использовать функцию ShellExecute из Shell32.dll с атрибутом SW_HIDE. Ниже приведен код загрузчика на C.

 
 #include <stdio.h>
 #include <windows.h>
 
 static char *ldr_file = "app.pl";
 static char *ldr_path = "";
 
 int main(int argc, char *argv[])
 {
   int code;
   LoadLibrary("shell32.dll");
   
   code = (int) ShellExecute(NULL, "open", ldr_file, ldr_path, NULL, SW_HIDE);
   if (code <= 32)
   {
  char buf[200];
  sprintf(buf, "Cannot run application. Code: %d", code);
  MessageBox(
  NULL,
  buf,
  "Dynld Error",
  MB_ICONERROR | MB_OK
  );
   }
 
   return code;
 }
 
Скомпилируйте gcc из MinGW.

gcc -mwindows loader.c -o loader.exe

Теги: #perl #perl
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.