OberonCore https://forum.oberoncore.ru/ |
|
Строки, указатели, файлы etc. https://forum.oberoncore.ru/viewtopic.php?f=81&t=965 |
Страница 1 из 1 |
Автор: | Nick [ Среда, 23 Апрель, 2008 15:22 ] |
Заголовок сообщения: | Строки, указатели, файлы etc. |
Здравствуйте. Как и у всякого, начинающего работать с новой системой, возникает масса вопросов. Пытаюсь освоить 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; Почему невозможно добавить символ к строке, ведь это тоже массив из одного символа? Надеюсь у Вас найдется пару минут, что бы просветить изучающего? |
Автор: | Илья Ермаков [ Среда, 23 Апрель, 2008 15:38 ] |
Заголовок сообщения: | Re: Строки, указатели, файлы etc. |
По поводу работы с 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. |
Автор: | Nick [ Четверг, 24 Апрель, 2008 14:20 ] |
Заголовок сообщения: | Re: Строки, указатели, файлы etc. |
Цитата: По поводу работы с WinAPI-функциями... Я пользуюсь в таких случаях файлами помощи MS SDK из поставки старых Borland Delphi. Если нужно, могу для Вас выложить (около 20 Мб). Спасибо за подробные ответы. Как оказалось, и у меня Win32.hlp от Delphi имеется Еще есть вопрос по поводу увязки интерфейсов и реализаций. Для примера возьмем Files. В своей программе я указываю IMPORT Files, в котором представлены только абстракции, но на самом деле вызываются процедуры из модуля HostFiles. В каком месте программы/BlackBox-a происходит фактическая привязка к реализации? Если у меня есть другой модуль реализации Files (допустим OtherFiles), то как можно подключить его для использования вместо HostFiles, возможно ли его переключить на лету? |
Автор: | Илья Ермаков [ Четверг, 24 Апрель, 2008 15:06 ] |
Заголовок сообщения: | Re: Строки, указатели, файлы etc. |
Чтобы подключить свою реализацию, надо описать своё расширение типа Files.Directory, а затем инсталлировать через Files.SetDir. HostFiles подключает себя сам при своей инициализации (последняя строка HostFiles.Init). Этот модуль входит в статически компонуемую часть среды (в BlackBox.exe), поэтому подключается на самом раннем этапе её загрузки. Как подключать другие реализации - см. в качестве примера HostPackedFiles. |
Автор: | Info21 [ Четверг, 24 Апрель, 2008 15:18 ] |
Заголовок сообщения: | Re: Строки, указатели, файлы etc. |
Илья Ермаков писал(а): Я пользуюсь в таких случаях файлами помощи MS SDK из поставки старых Borland Delphi. Если нужно, могу для Вас выложить (около 20 Мб). Илья Евгеньевич, а для меня -- выложите? Был бы благодарен. (Скачать эти 20М смогу только на следующей неделе.) |
Автор: | Trurl [ Четверг, 24 Апрель, 2008 17:02 ] |
Заголовок сообщения: | Re: Строки, указатели, файлы etc. |
А у меня есть в .odc ~ 3Mb. Не все правда, только описания функций. |
Автор: | Info21 [ Пятница, 25 Апрель, 2008 00:21 ] |
Заголовок сообщения: | Re: Строки, указатели, файлы etc. |
Trurl писал(а): А у меня есть в .odc ~ 3Mb. Не все правда, только описания функций. Так давайте тоже выложимте? |
Автор: | Trurl [ Пятница, 25 Апрель, 2008 08:10 ] |
Заголовок сообщения: | Re: Строки, указатели, файлы etc. |
http://inr.ac.ru/~trurl/WinApi.zip (630K) Распаковать в Win/Docu/ |
Автор: | Роман М. [ Пятница, 27 Апрель, 2012 23:09 ] |
Заголовок сообщения: | Re: Строки, указатели, файлы etc. |
Аналогично, наткнулся на ошибку "indexed object is not a variable". Логичного объяснения ошибке пока не вижу. |
Автор: | Евгений Темиргалеев [ Суббота, 28 Апрель, 2012 07:24 ] |
Заголовок сообщения: | Re: Строки, указатели, файлы etc. |
Илья Ермаков писал(а): По поводу работы с WinAPI-функциями - Вам нужно заполучить где-нибудь документацию по этому делу. Можно MSDN (msdn.microsoft.com или поставляется со всякими Студиями на дисках). Однако MSDN... Однако, MSDN вовсе не обязательно держать у себя, с безлимитными-то интернетами. Он доступен онлайн. Вводим в поисковик: msdn WinExec и смотрим (первая ссылка в гугле): http://msdn.microsoft.com/en-us/library ... 85%29.aspx. Содержимое более качественное и... гипертекстовое.
|
Автор: | Евгений Темиргалеев [ Суббота, 28 Апрель, 2012 07:36 ] |
Заголовок сообщения: | Re: Строки, указатели, файлы etc. |
Nick писал(а): Почему в первом случае компилятор выдает ошибку? Какая разница между CONST-массивом символов и присвоенным в переменную? Почему невозможно добавить символ к строке, ведь это тоже массив из одного символа? Потому что язык различает типы массив литер и цепочка литер (строка). Последняя может храниться в первом, но это не одно и тоже --- набор операций разный. Language Report писал(а): 6.2 Array Types
... 6.6 String Types ... |
Автор: | Евгений Темиргалеев [ Суббота, 28 Апрель, 2012 07:52 ] |
Заголовок сообщения: | Re: Строки, указатели, файлы etc. |
Nick писал(а): 1. Как можно запустить внешнюю программу, но с ожиданием пока она отработает? WinExec похоже запускает прогу как отдельный процесс и сразу же возвращает управление ББ. См. код HostDialog.Start; CreateProcess (внизу есть пример с WaitForSingleObject); см. так же GetExitCodeProcess Цитата: Remarks Этой штукой можно опрашивать из экшена (Services.Action), не завешивая ББ.
This function returns immediately. If the process has not terminated and the function succeeds, the status returned is STILL_ACTIVE... |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |