Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

Доработка модуля i21sysCalls
https://zx.oberon.org/forum/viewtopic.php?f=34&t=80
Страница 1 из 1

Автор:  Zorko [ 23 фев 2013, 18:55 ]
Заголовок сообщения:  Доработка модуля i21sysCalls

Для более полного охвата задач по запуску модулю 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

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

Автор:  Zorko [ 05 мар 2013, 07:31 ]
Заголовок сообщения:  Доработка модуля i21sysCalls

Обнаружилось, что иногда 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$ + "\" ? Ах да, а ведь ещё же остаются кавычки "", в которые юзер может взять путь, содержащий пробелы. Как быть?

Автор:  Zorko [ 03 июл 2013, 19:00 ]
Заголовок сообщения:  Re: Доработка модуля i21sysCalls

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

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

Страница 1 из 1 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/