Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 28 мар 2024, 20:14

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




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Доработка модуля i21sysCalls
СообщениеДобавлено: 23 фев 2013, 18:55 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Для более полного охвата задач по запуску модулю i21sysCalls не хватает логичной возможности запускать/открывать файлы (находящиеся, например, внутри подсистем ББ, но не только), путь до которых задан с помощью Locator. Я добавил процедуры:
Код: "OBERON"
  1. PROCEDURE OpenAt (loc: Files.Locator; IN fileName: ARRAY OF CHAR);
  2. PROCEDURE StartAt (loc: Files.Locator; IN exeName: ARRAY OF CHAR);
которые открывают/запускают заданный файл из папки, заданной локатором. Она на момент запуска является для приложения текущей. Это придаёт дополнительные возможности по интеграции ББ с документами и исполняемыми файлами/скриптами Windows.

Решение не отражено в документации i21sys/Docu

Суть сделанных мною изменений показывает данный коммит.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Доработка модуля i21sysCalls
СообщениеДобавлено: 05 мар 2013, 07:31 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Обнаружилось, что иногда HostFiles.Locator.path содержит абсолютный путь, а иногда — относительный (от корня ББ). Воспроизвести это можно так:
Код: "OBERON"
  1. PROCEDURE Do* ;
  2. VAR
  3. t: TextModels.Model; w: Windows.Window; loc: Files.Locator;
  4. BEGIN
  5. (* Try to find exact file name of current opened document: *)
  6. t := TextViews.FocusText();
  7. IF t # NIL THEN
  8. w := Windows.dir.Focus(Controllers.targetPath);
  9. IF (w # NIL) & (w.loc # NIL) & (w.name # "") THEN (* File name found. *)
  10. loc := w.loc;
  11. WITH loc: HostFiles.Locator DO
  12. StdLog.String(loc.path);
  13. END;
  14. END;
  15. ELSE
  16. Dialog.ShowMsg("#XDev:NoTextViewFound")
  17. END;
  18. END Do;

1. Абсолютный путь. Запустим любой .odc документ, ассоциированный с ББ. Do выдаст полный путь к нему:

d:\Archive\Projects\XDev\ZXDev\Lib\Mod

2. Относительный путь. Откроем из уже запущенного ББ любой документ, например, из подсистемы Dev/Docu, Do выдаст:

Dev\Docu

В связи с таким хитрым поведением локатора возникает вопрос: поскольку при вызове процедур StartAt/OpenAt мы полагаемся на абсолютный путь в локаторе, не может ли возникнуть ситуации, когда относительный путь приведёт к неудаче при запуске? Может для надёжности проверять, является ли путь относительным, и если да, то прибавлять к нему спереди Files.dir.This("")(HostFiles.Locator).path$ + "\" ? Ах да, а ведь ещё же остаются кавычки "", в которые юзер может взять путь, содержащий пробелы. Как быть?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Доработка модуля i21sysCalls
СообщениеДобавлено: 03 июл 2013, 19:00 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Исправил очень опасную ошибку, можно сказать, недосмотр в i21sys/Calls/StartAt. Там должен проверяться путь (папка по умолчанию для запускаемого файла), но я перепутал имя и указал неинициализированный массив, и он проверялся с помощью сравнения нулевого элемента curPath[0] на равность символу с кодом 0X. Как оказалось, в Win32 это как-то работало, а в Win64 сразу отказалось, но это и позволило найти ошибку.

Далее. Практика показала, что проблем с абсолютными/относительными путями нет никаких, всё прекрасно запускается, просто нужно знать, что в (HostFiles.Locator).path$ может храниться как абсолютный путь (например, если открыть документ с помощью ассоциации с BlackBox), так и относительный (от корневой папки BlackBox, например, если открыть документ с помощью File -> Open), и не удивляться. Работает.


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

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


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

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


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club