Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на Delphi

  Все выпуски  

Программирование на Delphi (выпуск 54)


Программирование на DELPHI
Выпуск #54 (05 августа 2006 г.)

Разделы сайта:

Новости сайта
Delphi.int.ru Expert
Файловый архив
Статьи
Компоненты
Plug-in's
Документация
Исходники
Изображения
Игры
Программы
Форум
F.A.Q.
Архив рассылки
Каталог сайтов
Обратная связь

Доброго времени суток, уважаемые читатели!

За время длительного перерыва на сайте кое-что изменилось, подробности см. ниже. С данного момента я приложу все усилия, чтобы выпускать рассылку регулярно. А от Вас жду интересной информации по программированию на Delphi и новых файлов для публикации.

На сайте Delphi.int.ru появилась возможность загрузки изображений (аватаров) для учётных записей. Загрузить свой рисунок или фотографию можно на странице настроек учётной записи, а вот прямая ссылка: http://www.delphi.int.ru/?name=avatar. Изображения постепенно интегрируются и в систему экспертной помощи Delphi.int.ru Expert, с помощью которой Вы можете решить свои проблемы и получить новые знания из области программирования. Все замечания и предложения отправляйте на admin@delphi.int.ru.

Приятного чтения и до скорой встречи!

Разделы рассылки:

Авторское слово
Delphi.int.ru Expert
Статья по Delphi
Файловый архив
Друзья
Юмор

Количество читателей рассылки: 5323.

Delphi.int.ru Expert

Задать вопрос экспертам >> Стать экспертом или уйти из состава экспертов >>Эксперты системы >>

Delphi.int.ru Expert  – вопросы и ответы (#61 - #70)
Вопрос № 61

Текст вопроса:

Как в XP скрыть процесс из диспетчера задач
Заранее спасибо

Автор вопроса: Ташбулатов Камиль РУст (статус: Посетитель)
Дата и время отправки вопроса: 26.06.2006, 09:46
Получено ответов на вопрос: 4
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Вадим К (статус: 7-ой класс), 26.06.2006, 11:30]:

Скажем так, решать на делфи подобные задачи - изврат. Наиболее лучше это делать на ассемблере. Почему? Вам прийдётся оперировать системными таблицами операционной системы. Но самое главное, это будет драйвер. Если не драйвер, то сделать это можно будет токо с правами админа, да и то, через одно место.

А почему Вам скрывать свой процесс? Здесь два варианта:
-Это вирус или программа шутка (убивать таких!)
-Прога для интернет клуба, что бы не могли закрыть(нада, и не такое закроют!).

А теперь раскажу как программируется эта вещь (токо идея!).
Когда диспетчер хочет отобразить список процессов, он берёт в памяти начало списка процессов (это будет первый процесс). Выводит эго данный. В одной с характеристик будет записан адрес описания следующего процесса.
Идея заключается в том, что бы подменить этот адрес или перехватить функцию, которая это делает и подменить её своей, которая будет сверять имя процесса и при надобности пропускать.
Почитать об этом всём можно здесь www.wasm.ru

Но есть ещё один метод. Написать программу, которая будет похожа на диспетчер задач, но не будет отображать определённые процессы. Вот это уже интересная задача.

2. [Отвечает: Alexander A. Gribanov (статус: 2-ой класс), 26.06.2006, 12:43]:

Ну вопрос немного не по Delphi... Тебе может помочь, например, книга Джеффри Рихтера "Windows для профессионалов". По googl'у можно найти електронный вариант.

3. [Отвечает: bruder (статус: 3-ий класс), 26.06.2006, 13:23]:

Здравствуйте, Ташбулатов Камиль РУст.
Способ 1: Грохнуть диспетчер :)
Способ 2: Ring0.......
В приложении исходник dll и самой программы.

Приложение:

4. [Отвечает: Матвеев Игорь Владимирович (статус: 10-ый класс), 26.06.2006, 13:49]:

Это можно сделать с помощью dll библиотеки, смотрите готовый пример в http://www.delphi.int.ru/expert/?step=download&id=4. Но некоторые антивири считают asm код в этой dll вирусом, поэтому иногда нужно подправить его - вставить лишние nop'ы, поменять mov на push/pop и т.д.
А вообще, заглядывайте на http://www.wasm.ru и больше не задавайте таких вопросов.



Вопрос № 62

Текст вопроса:

Добрый день.
Пишу не вирус!!!
Есть ли у кого исходник программы для передачи данных через сокеты?
Необходимо чтобы пользователь видел список файлов и мог делать с ними следующее: скачивать, закачивать, удалять, переим, запускать и прочее.
Также нужен редактор реестра (удалённый).
Пишу прогу для администратирования. В Delphi я -1 (даже не ноль :) )
Заранее благодарен
РS интерфейс файл-менеджера желательно как у троянов (или как их там).
Исходники можно скинуть на kama2005@mail.ru

Автор вопроса: Ташбулатов Камиль РУст (статус: Посетитель)
Дата и время отправки вопроса: 26.06.2006, 15:23
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 1
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: min@y™ (статус: 2-ой класс), 26.06.2006, 16:15]:

Скачай себе базу знаний Delphi World 6.0 вот отсюда: [url]http://dw.scienceinfo.de/DW6_full.exe[/url] (~31 МБ). Я вот сейчас глянул - там есть по крайней мере 4 статьи с исходниками, которые называются "[b]BackDoor - удалённое администрирование[/b]". Это то, что тебе надо.

З.Ы. Поскольку в Delphi ты -1, то настоятельно рекомендую начать с написания чего-нибудь попроще, а Ctrl+C/Ctrl+V тебя ничему не научит.



Вопрос № 63

Текст вопроса:

здраствуте
прочитал я статю - Копирование файлов - Выпуск #43 (08 марта 2006 г.) и вот сечас все мучаюсь как переделать код чтоб не скопировать файл - а чтоб соединить два файла.
за ранее благодарен

Приложение:

Автор вопроса: Oleg (статус: Посетитель)
Дата и время отправки вопроса: 26.06.2006, 18:48
Получено ответов на вопрос: 4
Сообщений в форуме вопроса: 1
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Помфюк Владимир Степанович (статус: 6-ой класс), 26.06.2006, 18:59]:

Здравствуйте, Oleg!
приблизительно так:

1. Копирование методом Pascal.
type
TCallBack=procedure (Position,Size:Longint); {Для индикации процесса копирования}

procedure FastFileCopy(Const InfileName1,InfileName2, OutFileName: String; CallBack: TCallBack);
Const BufSize = 3*4*4096; { 48Kbytes дает прекрасный результат }
type
PBuffer = ^TBuffer;
TBuffer = array [1..BufSize] of Byte;
var
Size : integer;
Buffer : PBuffer;
infile1, infile2, outfile : File;
SizeDone,SizeFile: Longint;
begin
if (InFileName1 <> OutFileName)and(InFileName2 <> OutFileName) then
begin
buffer := Nil;
AssignFile(infile1, InFileName1);
System.Reset(infile1, 1);
AssignFile(infile1, InFileName2);
System.Reset(infile1, 1);
try
AssignFile(outfile, OutFileName);
System.Rewrite(outfile, 1);
try
New(Buffer);
SizeFile := FileSize(infile1);
SizeDone := 0;
repeat
BlockRead(infile1, Buffer^, BufSize, Size);
Inc(SizeDone, Size);
CallBack(SizeDone, SizeFile);
BlockWrite(outfile,Buffer^, Size)
until Size < BufSize;
FileSetDate(TFileRec(outfile).Handle,
FileGetDate(TFileRec(infile1).Handle));

SizeFile := FileSize(infile2);
SizeDone := 0;
repeat
BlockRead(infile2, Buffer^, BufSize, Size);
Inc(SizeDone, Size);
CallBack(SizeDone, SizeFile);
BlockWrite(outfile,Buffer^, Size)
until Size < BufSize;
finally
if Buffer <> Nil then Dispose(Buffer);
System.close(outfile)
end;
finally
System.close(infile1);
System.close(infile2);
end;
end else
Raise EInOutError.Create('File cannot be copied into itself');
end;

Оценка за ответ: 2.
Комментарий: не работает :( пустой файл получается да и хотелось чтоб Файл1 приплюсовалсья к Файлу2

2. [Отвечает: min@y™ (статус: 2-ой класс), 27.06.2006, 08:17]:

Предлагаю использовать 2 экземпляра TFileStream. Могу, если надо, написать пример. Будет просто и изящно. Но сейчас времени нету, пиши в мыло или сюда на форум.

3. [Отвечает: bruder (статус: 3-ий класс), 27.06.2006, 09:57]:

Здравствуйте, Oleg!
Сам пользуюсь этим: (один минус-получившийся файл использовать не удасться, его нужно будет сначало "распаковать".)

Приложение:

4. [Отвечает: Косолапов Дмитрий Юрьевич (статус: 2-ой класс), 27.06.2006, 10:03]:

В первом способе вместо Rewrite(outfile, 1) Reset(outfile, 1). Наверное, надо будет еще и спозиционироваться на конце файла (Seek).

Во втором способе вместо T := TFileStream.Create(targetfilename, fmOpenWrite or fmCreate) попробуй T := TFileStream.Create(targetfilename, fmOpenReadWrite)

В третьем способе - аналогично первому

Оценка за ответ: 3.



Вопрос № 64

Текст вопроса:

Подскажите, что надо сделать, чтобы форма находилась поверх всех окон.
Спасибо!

Автор вопроса: Игорь Середюк (статус: Посетитель)
Дата и время отправки вопроса: 27.06.2006, 13:21
Получено ответов на вопрос: 6
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Помфюк Владимир Степанович (статус: 6-ой класс), 27.06.2006, 14:19]:

Здравствуйте, Игорь Середюк!
Вам нужно свойствe FormStyle дать значение fsStayOnTop

Приложение:

2. [Отвечает: Вадим К (статус: 7-ой класс), 27.06.2006, 14:24]:

Здравствуйте, Игорь Середюк!
У формы Formstyle="fsStayOnTop"
Но для полного функционала, наверное прийдётся перехватывать деактивацию формы и выводить её поверх. Но после того, как в 3.11 windows программисты взяли привычку выводить окошка повер всех, майкрософт зделала многое, что бы препятствовать этому.

3. [Отвечает: Евгений В (статус: 1-ый класс), 27.06.2006, 14:33]:

Здравствуйте, Игорь Середюк!
В свойстве FormStyle поставте значение fsStayOnTop.

4. [Отвечает: Alexander A. Gribanov (статус: 2-ой класс), 27.06.2006, 17:01]:

А чем не угодило свойство формы FormStyle, установленное в fsStayOnTop ?
Если действительно чем-то не угодило - можно посмотреть на win-API функцию SetForegroundWindow() и те, что рядом с ней...

5. [Отвечает: min@y™ (статус: 2-ой класс), 28.06.2006, 08:15]:

Если надо поверх всех окон ТВОЕГО приложения, то действительно, FormStyle:= fsStayOnTop;. А если надо повесить окно поверх ВСЕХ окон СИСТЕМЫ, то см. приложение.

Приложение:

6. [Отвечает: Programme® (статус: 1-ый класс), 28.06.2006, 19:26]:

Здравствуйте, Игорь Середюк!
Для того, чтобы форму сделать поверх окон надо в пункте "FormStyle" "Инспектор объектов" выбрать "fsStayOnTop", либо смотри приложение.

Приложение:



Вопрос № 65

Текст вопроса:

На невидимой форме3 расположен РичЕдит1 (на всб форму). В какое то время РичЕдит заполняется строками. Мне нужно, чтобы только при свернутой главной форме1, заполнился РичЕдит1 на форме3. После этого надо чтобы форма3 изменила разме так, чтобы ширина равнялась длине самой длиной строки в РичЕдит1 (но не больше чем длина строки в 22 символа шрифтом Courier New размером Size=10, и + может быть ширина полосы прокрутки), а высота должна быть такой, сколько занимают строки в РичЄдит1(но не больше чем на 6 строк темже шрифтом). При этом, если в РичЕдит1 строк больше чем 6, то надо чтобы включилась полоса прокрутки, и форма3 изменила ширину на ширину полосы прокрутки.
После этого форма должна стать видимой на некоторое время (заданое пользователем в ИНИ файле, домустим 3сек.), и находиться в это время поверх всех окон. При она должна отобразится в прамо нижнем углу так, чтобы нижний край формы3 "лежал" на панели задач (находился на уровне верхнего края панели задач), а правый край находился по правому краю видимой части монитора, или на несколько пунктов левее. При отображении формы3 на несколько секунд, главная форма1 должна оставаться свернутой.

Помогите, пожалуйста!!! Спасибо.

Автор вопроса: Игорь Середюк (статус: Посетитель)
Дата и время отправки вопроса: 27.06.2006, 13:46
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Помфюк Владимир Степанович (статус: 6-ой класс), 27.06.2006, 14:49]:

Здравствуйте, Игорь Середюк!
Courier New - моноширинный шрифт (начертание всех символов имеет одинаковую ширину), так что ширину символа можно померять например так: компоненту Edit даете свойство AutoSize:=true (шрифт и размер тоже разумеется меняете) и пишете в него один символ, замечаете ширину, дописываете второй - шиина изменяется. разница - один символ. Для уверенности можете еще несколько дописать - проверить. Высота - аналогично (возможно придется Memo расширять/сужать вручную, но для 6ти строк зависимость найдете более-менее точно).
RichEdit - "умный" и полосы прокрутки включает сам по мере надобности. Единственное что вам надо - при количестве строк более 6ти - изменить ширину формы (как узнать на сколько - см. выше :-) )
Чтоб задать положение формы Вам надо использовать Screen.DesktopHeight, Screen.DesktopWidth, Screen.DesktopTop, Screen.DesktopLeft
Поверх всех окон FormStyle:=fsStayOnTop;
Чтобы показать на 3 секунды и в это время что-то добавлялось в RichEdit следует использовать Timer (Как альтернатива можно просто показать окно "повесить" программу на 3 секунды и спрятать, но это - криво)

2. [Отвечает: bruder (статус: 3-ий класс), 27.06.2006, 17:11]:

Здравствуйте, Игорь Середюк!
Вот что у меня получилось. Ограничение не стал делать, времени не хватило, это не сложно и самому сделать.
http://www.delphi.int.ru/expert/?step=download&id=5



Вопрос № 66

Текст вопроса:

Уважаемые эксперты!
Столкнулся с проблемой... В приложении функция, которая возвращает код нажатой на клавиатуре клавиши. Но происходит странное - если форма свёрнута, то функция перестаёт работать! Вызов происходит по таймеру, таймер работает. А вот функция - уже нет. В справке GetKeyboardState() не описано о каких-либо ограничениях этой функции... Тогда почему же не работает? Очень надеюсь на вашу помощь! Заранее благодарю за ответы.

Приложение:

Автор вопроса: Dron (статус: 8-ой класс)
Дата и время отправки вопроса: 27.06.2006, 16:42
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 3
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: min@y™ (статус: 2-ой класс), 28.06.2006, 09:05]:

Создал я проект, кинул на форму таймер и Мемо. В обработчике OnTimer() написал код (см. приложение). Интервал у таймера поставил по минимуму. Так вот, в мемо добавляется строка, только когда окно программы активно. Я свернул все окна, кроме окна этой проги и попытался переименовать ярлык на рабочем столе, используя клаву "пробел". В Мемо не добавилось ни одной строки. Видимо, функция GetKeyboardState() работает только в активном приложении/окне. А активное приложение очищает буфер клавы после считывания его содержимого.

Если пишешь кейлоггер, то советую поставить клавиатурный хук (SetWindowsHookEx()). Статей на эту тему в инете - тьма.

Приложение:

Оценка за ответ: 3.
Комментарий: Вы просто повторили мой вопрос. Я спрашивал, как от этого избавиться. Хуки не предлагать.

2. [Отвечает: Матвеев Игорь Владимирович (статус: 10-ый класс), 28.06.2006, 14:02]:

Здравствуйте, Dron!
GetKeyboardState() показывает состояние клавиатуры в соостетствии с фокусом ввода и, естественно, не реагирует на нажатия клавиш, когда фокус ввода не в Вашем приложении.
Вы можете использовать GetAsyncKeyState(), описание есть в SDK.

Оценка за ответ: 5.
Комментарий: Спасибо, теперь понял. Но функция GetAsyncKeyState() мне не очень подходит - нужно узнавать именно код нажатой клавиши, а какая будет нажата - неизвестно. Перебор в цикле ничего хорошего не даст - только загрузит процессор. Игорь, какие ещё есть варианты решения проблемы?



Вопрос № 67

Текст вопроса:

Возможно и в Delphi-программе открыть DVD дисковод?

Автор вопроса: Иван (статус: Посетитель)
Дата и время отправки вопроса: 27.06.2006, 21:48
Получено ответов на вопрос: 3
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: min@y™ (статус: 2-ой класс), 28.06.2006, 08:44]:

Скачай пакет модулей DelphiWorks вот отсюда: http://www.torry.net/vcl/packs/middle/dw.zip
Там есть модуль DriveWorks.pas, в котором, помимо прочего, есть вот такие 2 функции:

function OpenCD(Drive: Char): Boolean;
function CloseCD(Drive: Char): Boolean;

О результатах работы этих функций сообщи на форум этого вопроса.

2. [Отвечает: Косолапов Дмитрий Юрьевич (статус: 2-ой класс), 28.06.2006, 10:29]:

Если не хочется использовать сторонние модули, вот две процедуры. 1-я получает список всех CD-ROM (я думаю, пригодится), а 2-я открывает/закрывает трей нужного диска. И не забудь подключить модуль mmsystem.

Приложение:

3. [Отвечает: Матвеев Игорь Владимирович (статус: 10-ый класс), 28.06.2006, 14:19]:

Здравствуйте, Иван!
Скажу Вам по секрету, открытие/закрытие DVD абсолютно ничем не отличается от открытия/закрытия CD, поскольку за это отвечает единый Media Control Interface (MCI), реализованный ввиде winmm.dll. Большинство функций реализуются через посылку командных строк в функцию mciSendStringA.
Открыть привод: "set cdaudio door open"
Закрыть привод: "set cdaudio door closed".
Готовых примеров полно в Интернете.
P.S. Просто добавил к предыдущим ответам, чтобы было понятно как это работает.



Вопрос № 68

Текст вопроса:

Уважаемые эксперты! В продолжение вопроса №66... Всё получилось сделать, только теперь небольшая проблема. Иногда вместо символов программа получает непечатаемые символы. Обычно они отображаются как узкие прямоугольники, похожие на букву "I", но бОльшей толщины. Собственно вопрос: как проверить - печатный это символ или какой-то служебный? Всё дело в том, что некоторые функции из-за этих символов вылетают с ошибкой... Заранее благодарю.

Автор вопроса: Dron (статус: 8-ой класс)
Дата и время отправки вопроса: 28.06.2006, 17:23
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Yurchik (статус: 3-ий класс), 29.06.2006, 01:31]:

Здравствуйте, Dron!
В принципе служебные символы имеют коды 0-31. Но тогда получается, что табуляция (#9) - тоже служебный символ.
В твоем случае можно создать множество печатных символов, а потом проверять символ на принадлежность к этому множеству:

type
TPrintSymbs = set of Char;
const
PrintSymbs: TPrintSymbs = ['0'..'9', 'A'..'Z', 'a'..'z', ' ', ...]; // нужно заполнить всеми печатаемыми символами
...
if chr($20) in PrintSymbs then
...

Наверно это не самый оптимальный вариант. Может уже написаны функции, позволяющие делать нужную тебе проверку. Возможно, проще модифицировать твои функции, чтобы они корректно реагировали на любые символы.
Во всяком случае, это рабочий вариант. Удачи!

Оценка за ответ: 5.



Вопрос № 69

Текст вопроса:

Возможно ли в Windows XP програмно включить/отключить индикатор CAPS LOCK, NUM LOCK или Scroll Lock.
Функция SetKeyboardState работает только в Windows 98.

Автор вопроса: Иван (статус: Посетитель)
Дата и время отправки вопроса: 28.06.2006, 19:26
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Yurchik (статус: 3-ий класс), 29.06.2006, 01:00]:

Здравствуйте, Иван!
Судя по описанию функции SetKeyboardState в MSDN, она не будет работать с клавишами CAPS LOCK, NUM LOCK или Scroll Lock даже в Win98. Вместо этой функции следует использовать функцию SendInput(). Вот примерчик. При необходимости можно контролировать возращаемое функцией SendInput значение: если оно равно нулю, какой-то другой поток заблокировал ввод.

Приложение:

2. [Отвечает: Виталий Лещенко (статус: 2-ой класс), 29.06.2006, 18:29]:

Здравствуйте, Иван!
Вот вам пример "мигания" индикаторами.
imho довольно простой код, но если что...

Приложение:



Вопрос № 70

Текст вопроса:

Возможно ли в Windows XP програмно включить/отключить индикатор CAPS LOCK, NUM LOCK или Scroll Lock.
Функция SetKeyboardState работает только в Windows 98.

Автор вопроса: Иван (статус: Посетитель)
Дата и время отправки вопроса: 28.06.2006, 19:26
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Alexander A. Gribanov (статус: 2-ой класс), 29.06.2006, 10:15]:

Тебе поможет функция keyb_event(). В приложении пример функции, которая устанавливает нужное состояние NumLock.

Приложение:




Статьи  >>

Любой из читателей может присылать свои статьи по адресу info@delphi.int.ru и они будут опубликованы в ближайших выпусках рассылки и на сайте.


Файловый архив  >>

Название
Описание
Категория
Объём
Ссылки
Учебник по Delphi 7 для начинающих. Формат: CHM.
1.84 Мб

В.Гофман, А.Хомоненко - "Delphi: Быстрый старт":

- Основы работы в среде Delphi;
- Приёмы создания приложений;
- Разработка и использование баз данных;
- Примеры программ.

Формат: PDF (для просмотра потребуется Adobe Acrobat Reader).

5.11 Мб

Если у Вас есть книги по Delphi (в электронном виде, разумеется) или другая полезная документация - сообщите и её можно будет разместить на сайте.

Отправить файл »   

Ссылки  >>

Обмен баннерами приветствуется для сайтов схожей тематики. По поводу размещения текстовых ссылок обращайтесь сюда.

TIBRAZCO - Бесплатный софт, анекдоты про программистов, рассылка по программированию, справочники, учебники, советы по программированию.
http://xskernel.excode.ru/
Сайт, посвящённый написанию операционной системы. Новости, информация об XSystem Kernel Team, документация, глоссарий, исходники системы. Open Source - наше направление.
 
Рассылки Subscribe.Ru
Интернет для Delphi-программиста
Visual Basic для новичков и профессионалов
Программирование на Delphi
   
 

Юмор.

Ведущий раздела: Bruder

Среди всех космических курьезов и розыгрышей первое место по праву принадлежит шутке Оуэна Гарриотта. В 1973 году он входил в экипаж американской орбитальной станции "Скайлэб". Розыгрыш, который он устроил над офицером Центра управления полетами Робертом Криппеном, достоин навечно войти в историю космонавтики.

С собой в космос Гарриотт захватил диктофон, на который его супруга наговорила несколько заранее составленных фраз. Когда в один из дней оператор Роберт Криппен вышел на связь с орбитальной станцией, Гарриотт ждал у передатчика с диктофоном в руке.

Между станцией и Центром управления состоялся следующий диалог:

- "Скайлэб", это Хьюстон, ответьте.
- Здравствуйте, Хьюстон, - бодрым женским голосом отозвалась станция.
- Это "Скайлэб".
Земля после секундного колебания поинтересовалась:
- Кто говорит?
- Привет, Боб, - отозвалась станция. - Это Хелен, жена Оуэна.

Боб несколько секунд переваривал ответ, а затем с трудом выдавил:

- Что ты там делаешь?
- Я тут решила ребятам поесть принести. Все свеженькое, - успокоил его голос с орбиты.

Центр управления молчал около минуты, а затем отключился.
Видимо, у офицера связи сдали нервы.

Историю прислал: Пропищин Роман.

:))

Присылайте компьютерные анекдоты, рассказы и истории по этой ссылке и они обязательно будут опубликованы.
Ведущий рассылки, Ерёмин Андрей.

В избранное