OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 16 Июнь, 2019 02:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Строки, указатели, файлы etc.
СообщениеДобавлено: Среда, 23 Апрель, 2008 15:22 
Аватара пользователя

Зарегистрирован: Среда, 23 Апрель, 2008 07:22
Сообщения: 3
Откуда: Украина, Запорожская обл.
Здравствуйте. Как и у всякого, начинающего работать с новой системой, возникает масса вопросов. Пытаюсь освоить BlackBox, но все больше получается методом "научного втыка", т.к. много непонятного. Итак, пишу программу, которая в общих чертах должна делать вот что: берет с определенного каталога список файлов, переименовывает их по установленным сверху правилам, архивирует, создает e-mail с прикрепленным архивом, удаляет теперь уже ненужные файлы. Вот собственно и все действия.

Но вот при кодировании возникают вопросы:

1. Как можно запустить внешнюю программу, но с ожиданием пока она отработает? WinExec похоже запускает прогу как отдельный процесс и сразу же возвращает управление ББ. Получается: архиватор еще работает, а Bat уже создает письмо с еще несуществующим архивом, ну и напоследок файлы удаляются, не успев обработаться. Лепить задержки наподобие REPEAT GetTime UNTIL (пройдет секунд 10-20), но это слишком сильно грузит процессор. К тому же неизвестно сколько времени может понадобиться архиватору (и почтовику) для обработки.


2. PROCEDURE WinExec (lpCmdLine: WinApi.PtrSTR; uCmdShow: INTEGER): INTEGER;
В интерфейсе WinApi нашел такую процедуру для запуска внешней программы, но откуда мне узнать, что такое 'uCmdShow'? Опять тыкаю наугад, сначала ноль, а затем - единичку... :-)


3. PROCEDURE Exec (IN prog: ARRAY cmdLen OF SHORTCHAR);
VAR i: INTEGER;
p: WinApi.PtrSTR;
BEGIN
p := prog;
i := WinApi.WinExec(p, 1);
END Exec;

Переменная 'p' - указатель, а 'prog' - массив. Что в данном случае я присвоил: указателю адрес массива, или значение массива (но память под него не выделялась)?


4. Имеется ли средство перемещения файлов (move) в пределах одного диска без создания копии исходного файла?


5. Со строками тоже не все гладко:
PROCEDURE Test;
CONST a = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
VAR c: CHAR;
BEGIN
c := a[10]; (*indexed object is not a variable ???*)
END Test;

PROCEDURE Test1;
VAR a: ARRAY 40 OF CHAR;
c: CHAR;
BEGIN
a := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
c := a[10];
END Test1;

Почему в первом случае компилятор выдает ошибку? Какая разница между CONST-массивом символов и присвоенным в переменную?

А также:
PROCEDURE Test;
VAR s: ARRAY 40 OF CHAR;
c: CHAR;
BEGIN
s := 'abcde';
s := c; (*incompatible operands of dyadic operator ???*)
END Test;

Почему невозможно добавить символ к строке, ведь это тоже массив из одного символа?


Надеюсь у Вас найдется пару минут, что бы просветить изучающего?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки, указатели, файлы etc.
СообщениеДобавлено: Среда, 23 Апрель, 2008 15:38 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9121
Откуда: Россия, Орёл
По поводу работы с WinAPI-функциями - Вам нужно заполучить где-нибудь документацию по этому делу. Можно MSDN (msdn.microsoft.com или поставляется со всякими Студиями на дисках). Однако MSDN - слишком большая помойка.... Я пользуюсь в таких случаях файлами помощи MS SDK из поставки старых Borland Delphi. Если нужно, могу для Вас выложить (около 20 Мб).

Так вот, по существу - WinExec устарела, осталась от Win3.1. Сейчас нужно использовать CreateProcess. Она отдаст описатель созданного процесса, затем Вы примените к нему функцию WaitForSingleObject - и Ваш процесс будет заморожен до тех пор, пока не завершится выполнение другого.

По поводу
Цитата:
PROCEDURE Exec (IN prog: ARRAY cmdLen OF SHORTCHAR);
VAR i: INTEGER;
p: WinApi.PtrSTR;
BEGIN
p := prog;
i := WinApi.WinExec(p, 1);
END Exec;


Здесь небезопасному указателю p присваивается адрес массива prog.
Подробнее про низкоуровневые средства можете почитать в документации в разделе "Платформенно-зависимые средства" (Platform-Specific Issues).

Цитата:
4. Имеется ли средство перемещения файлов (move) в пределах одного диска без создания копии исходного файла?


Через WinAPI - MoveFile - MoveFileEx.

По поводу констант - ну да, не индексируются константы...
И символьная переменная массиву символов тоже не присваивается/не плюсуется.
Можно len := LEN(s$); s[len+1] := 0X; s[len] := c.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки, указатели, файлы etc.
СообщениеДобавлено: Четверг, 24 Апрель, 2008 14:20 
Аватара пользователя

Зарегистрирован: Среда, 23 Апрель, 2008 07:22
Сообщения: 3
Откуда: Украина, Запорожская обл.
Цитата:
По поводу работы с WinAPI-функциями... Я пользуюсь в таких случаях файлами помощи MS SDK из поставки старых Borland Delphi. Если нужно, могу для Вас выложить (около 20 Мб).


Спасибо за подробные ответы. Как оказалось, и у меня Win32.hlp от Delphi имеется :)

Еще есть вопрос по поводу увязки интерфейсов и реализаций. Для примера возьмем Files. В своей программе я указываю IMPORT Files, в котором представлены только абстракции, но на самом деле вызываются процедуры из модуля HostFiles. В каком месте программы/BlackBox-a происходит фактическая привязка к реализации? Если у меня есть другой модуль реализации Files (допустим OtherFiles), то как можно подключить его для использования вместо HostFiles, возможно ли его переключить на лету?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки, указатели, файлы etc.
СообщениеДобавлено: Четверг, 24 Апрель, 2008 15:06 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9121
Откуда: Россия, Орёл
Чтобы подключить свою реализацию, надо описать своё расширение типа Files.Directory, а затем инсталлировать через Files.SetDir.

HostFiles подключает себя сам при своей инициализации (последняя строка HostFiles.Init).
Этот модуль входит в статически компонуемую часть среды (в BlackBox.exe), поэтому подключается на самом раннем этапе её загрузки.

Как подключать другие реализации - см. в качестве примера HostPackedFiles.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки, указатели, файлы etc.
СообщениеДобавлено: Четверг, 24 Апрель, 2008 15:18 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8127
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Я пользуюсь в таких случаях файлами помощи MS SDK из поставки старых Borland Delphi. Если нужно, могу для Вас выложить (около 20 Мб).

Илья Евгеньевич, а для меня -- выложите?
Был бы благодарен.
(Скачать эти 20М смогу только на следующей неделе.)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки, указатели, файлы etc.
СообщениеДобавлено: Четверг, 24 Апрель, 2008 17:02 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1194
А у меня есть в .odc ~ 3Mb. Не все правда, только описания функций.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки, указатели, файлы etc.
СообщениеДобавлено: Пятница, 25 Апрель, 2008 00:21 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8127
Откуда: Троицк, Москва
Trurl писал(а):
А у меня есть в .odc ~ 3Mb. Не все правда, только описания функций.

Так давайте тоже выложимте?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки, указатели, файлы etc.
СообщениеДобавлено: Пятница, 25 Апрель, 2008 08:10 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1194
http://inr.ac.ru/~trurl/WinApi.zip (630K)
Распаковать в Win/Docu/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки, указатели, файлы etc.
СообщениеДобавлено: Пятница, 27 Апрель, 2012 23:09 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Аналогично, наткнулся на ошибку "indexed object is not a variable". Логичного объяснения ошибке пока не вижу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки, указатели, файлы etc.
СообщениеДобавлено: Суббота, 28 Апрель, 2012 07:24 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Илья Ермаков писал(а):
По поводу работы с WinAPI-функциями - Вам нужно заполучить где-нибудь документацию по этому делу. Можно MSDN (msdn.microsoft.com или поставляется со всякими Студиями на дисках). Однако MSDN...
Однако, MSDN вовсе не обязательно держать у себя, с безлимитными-то интернетами. Он доступен онлайн. Вводим в поисковик: msdn WinExec и смотрим (первая ссылка в гугле): http://msdn.microsoft.com/en-us/library ... 85%29.aspx. Содержимое более качественное и... гипертекстовое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки, указатели, файлы etc.
СообщениеДобавлено: Суббота, 28 Апрель, 2012 07:36 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Nick писал(а):
Почему в первом случае компилятор выдает ошибку? Какая разница между CONST-массивом символов и присвоенным в переменную? Почему невозможно добавить символ к строке, ведь это тоже массив из одного символа?
Потому что язык различает типы массив литер и цепочка литер (строка). Последняя может храниться в первом, но это не одно и тоже --- набор операций разный.
Language Report писал(а):
6.2 Array Types
...
6.6 String Types
...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строки, указатели, файлы etc.
СообщениеДобавлено: Суббота, 28 Апрель, 2012 07:52 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Nick писал(а):
1. Как можно запустить внешнюю программу, но с ожиданием пока она отработает? WinExec похоже запускает прогу как отдельный процесс и сразу же возвращает управление ББ.
См. код HostDialog.Start; CreateProcess (внизу есть пример с WaitForSingleObject); см. так же GetExitCodeProcess
Цитата:
Remarks

This function returns immediately. If the process has not terminated and the function succeeds, the status returned is STILL_ACTIVE...
Этой штукой можно опрашивать из экшена (Services.Action), не завешивая ББ.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB