Когда мы пишем графическое приложение, бывает, что нам нужно вызывать внешние программы и читать из 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;
Вызывается команда 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
-
Права Ребенка
19 Oct, 24 -
Эластичный Поиск В Корпоративных Проектах
19 Oct, 24 -
Самодельная Дымовая Машина
19 Oct, 24 -
Тестирование Комплекта Ez-Robots
19 Oct, 24 -
Филологический Спор О Доступе К Гостам
19 Oct, 24