Значит, ТК не запрашивает содержимое виртуальной панели, а содержимое противоположной обновляет. К сожалению, тут я вряд ли смогу что-то сделать, т.к. проследить изменение файла обычными средствами FS-модуля невозможно, кроме того, у меня нет фоновых потоков, только основной, который вызывается из ТК только при необходимости, к которой не относится обновление виртуальной панели при изменении физического файла.likhobory писал(а):не обновляется размер файла при его редактировании непосредственно из ВП пока не выполнишь cm_RereadSource. При этом, если этот же файл отображается на противоположной реальной панели - там все обновляется
[WFX] VirtualPanel - временная панель для ТК (Unicode)
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
- Вахмурка
- Сообщения: 2587
- Зарегистрирован: Пн дек 27, 2004 14:47
- Откуда: Большая деревня Москва
- Контактная информация:
Вопрос по команде cd:Если можно, то как? Если нельзя, то нет ли планов изменить положение?
Смущают последние слова. Получается, что команда cd влияет только на скрипт. Нельзя ли, находясь в одной виртуальной папке, по данной команде перейти в другую, как это делается в DOS:Изменяет текущую папку в пределах текущего скрипта
Код: Выделить всё
<cd ..
<cd \
<cd abc
<cd ..\abcСайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Я ж не могу сказать ТК изменить папку. Хотя, разве что той функцией, которая в фоновом потоке посылает сообщение WM_COPYDATA. А вообще, команда <cd задумывалась для того, чтобы во время выполнения скрипта можно было установить папку-основу для относительных имен файлов, ведь скрипт может быть запущен и не из нужной папки. В общем, лучше сделать отдельные команды, или особый флаг для команды cd, потому что во-первых не всегда удобно менять текущий путь при запуске скрипта, во-вторых, долго - пока создатся поток, пока отправится-обработается сообщение и т.д. и т.п.
Кстати, есть идея. Я могу по обычной команде cd физически изменять текущую папку - это будет своего рода команда-исключение, которая не начинается символом '<', но обрабатывается VP, так как ТК ленится обрабатывать ее в FS-панелях.
И тут проблема. Чтобы изменить путь в пределах VP, я должен знать имя VP-модуля, в противном случае перейти в папку внутри него невозможно. В информации команды cd же его не содержится, если только не указан полный путь, полученный с помощью Ctrl+Shift+Enter. Можно, конечно, добавить параметр в файл конфигурации... Еще предложения?
Кстати, есть идея. Я могу по обычной команде cd физически изменять текущую папку - это будет своего рода команда-исключение, которая не начинается символом '<', но обрабатывается VP, так как ТК ленится обрабатывать ее в FS-панелях.
И тут проблема. Чтобы изменить путь в пределах VP, я должен знать имя VP-модуля, в противном случае перейти в папку внутри него невозможно. В информации команды cd же его не содержится, если только не указан полный путь, полученный с помощью Ctrl+Shift+Enter. Можно, конечно, добавить параметр в файл конфигурации... Еще предложения?
- Вахмурка
- Сообщения: 2587
- Зарегистрирован: Пн дек 27, 2004 14:47
- Откуда: Большая деревня Москва
- Контактная информация:
Почти во все команды первым же параметром входит то, что ты называешь <virtual_path>. Если я правильно успел понять, "\" - это корень VirtualPanel, "\abc" - ее подпапка abc, и т.д. То есть работать с директориями VirtualPanel умеет, иначе она бы не знала что куда класть (скажем, по команде <put). А тут не надо ничего никуда копировать, надо осуществить переход к указанной виртуальной папке. Причем VirtualPanel вовсе не обязана заботиться о том, чтобы папка существоваала: если юзверь ошибся в команде, ничего не происходит.
Все же, видимо, я не понял твою предыдущую мысль.
Все же, видимо, я не понял твою предыдущую мысль.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Хорошо, я поясню. В пределах виртуальной панели пути начинаются с символа обратного слэша, например, "\abc", и обрабатываются так же. Но для ТК этот путь будет иным: "\\\Virtual Panel (или иное имя модуля)\abc". Получается, если юзер пишет "cd \abc", я должен сказать ТК, что надо перейти в папку "\\\Virtual Panel (или иное имя модуля)\abc". И проблема как раз в том, что я не знаю, как у моего модуля выглядит это самое "Virtual Panel (или иное имя модуля)". Я пытался предложить Гислеру добавить это имя модуля в информационную структуру, которую ТК присылает при инициализации модуля (в то время я пытался решить проблему возможности загрузки нескольких независимых VP, и это позволило бы иметь для каждой независимую секцию в файле конфигурации FS-модулей), но идея не прижилась, скажем так. Это абсолютно несложно - добавить поле к структуре - ничего не пострадает, но не я командую парадом:) ОК, я предложил добавить поле еще раз, с новыми обстоятельствами, посмотрим...
- Вахмурка
- Сообщения: 2587
- Зарегистрирован: Пн дек 27, 2004 14:47
- Откуда: Большая деревня Москва
- Контактная информация:
Вот еще серьезный косяк. Заметил давно, но не мог установить закономерность.
Как мы выполняем команду Shut down/Restart/Logoff? Закрываем ли мы перед этим все программы? Закрываем ли мы Тотал? Для меня на первый вопрос ответ, как правило, положительный, на второй - обычно отрицательный.
Так вот, при "штатном" закрытии Тотала база будет
)
То есть кладем что-либо в VirtualPanel и, не закрывая Тотала, даем команду Logoff Windows. При запуске Тотала база "старая" (что подтверждается и временем записи тоже).
Как мы выполняем команду Shut down/Restart/Logoff? Закрываем ли мы перед этим все программы? Закрываем ли мы Тотал? Для меня на первый вопрос ответ, как правило, положительный, на второй - обычно отрицательный.
Так вот, при "штатном" закрытии Тотала база будет
, а вот при "нештатном" (если его закрытие выполняет не пользователь, а ОСь) - нет. Видимо, все дело в обработке сообщения WM_CLOSE (могу ошибаться, давно это былосохраняться в этот файл при финализации
То есть кладем что-либо в VirtualPanel и, не закрывая Тотала, даем команду Logoff Windows. При запуске Тотала база "старая" (что подтверждается и временем записи тоже).
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Да, есть такое дело. Проблема в том, что ТК не реагирует на сообщение WM_ENDSESSION, а мне, чтобы на него реагировать, надо заводить фоновый поток чисто для проверки сообщений (возможно, при этом нужно будет создавать невидимое окно, хотя вроде есть более цивильные способы), или же субклассить главное окно ТК, что не есть хорошая идея. В принципе, наверное, можно и хук написать, но опять же это немного выходит за рамки (да и не люблю я городить огород без крайней необходимости).
Впрочем, возможно, я напишу фоновый поток, который будет ловить сообщение WM_ENDSESSION, заодно можно будет сохранять базу с заданным интервалом времени (в базе уже есть флаг модифицированности, поэтому если изменений не было, будет легко понять, что сохранять не нужно).
Ну и, конечно же, не стоит забывать, что всегда могут возникнуть новые нештатные ситуации. Например, если кто-то убивает процесс ТК, вообще нет возможности узнать об этом, а даже если узнаешь, отреагировать не успеешь.
Впрочем, возможно, я напишу фоновый поток, который будет ловить сообщение WM_ENDSESSION, заодно можно будет сохранять базу с заданным интервалом времени (в базе уже есть флаг модифицированности, поэтому если изменений не было, будет легко понять, что сохранять не нужно).
Ну и, конечно же, не стоит забывать, что всегда могут возникнуть новые нештатные ситуации. Например, если кто-то убивает процесс ТК, вообще нет возможности узнать об этом, а даже если узнаешь, отреагировать не успеешь.
- Вахмурка
- Сообщения: 2587
- Зарегистрирован: Пн дек 27, 2004 14:47
- Откуда: Большая деревня Москва
- Контактная информация:
Ну, это-то понятно. Аналогично пропадают изменения в wincmd.ini.Например, если кто-то убивает процесс ТК, вообще нет возможности узнать об этом, а даже если узнаешь, отреагировать не успеешь.
Тестирование твоего плагина совпало для меня с тесированием нового компа и новой оси, поэтому Тотал падал у меня частенько, вот я и не распознал косяк вовремя.
А не удастся ли опционально сохранять базу после каждого изменения ВП? Видимо, это скажется на быстродействии, но раз все так плохо, я готов пожертвовать скоростью.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Это сильно замедлит скорость при работе с большой базой. Даже если сохранение будет длиться хотя бы секунду, ты заметишь это.
В общем, ловить сообщения в фоновом потоке не вышло, но натравить хук на поток ТК, в котором находится главное окно, получилось - моя хук-функция получает сообщение WM_QUERYENDSESSION.
Странно, что ТК молча схлопывается, получив сообщение WM_QUERYENDSESSION, при этом не выгружая модули - по идее, получив это сообщение, приложения должны лишь сказать, можно ли завершать работу, но никак не закрываться, тем более без сохранения данных. А тут я запускаю ТК, открываю блокнот, пишу там че-то (гарант того, что система не завершит работу по команде выключения - просто надо нажать Отмена на вопрос блокнота о закрытии), жму выключить комп, ТК закрывается (причем, судя по логу, без выгрузки модулей)...
В общем, я исследовал более подробно обработку сообщений WM_QUERYENDSESSION и WM_ENDSESSION и заметил, что если приложение возвращает 1 на WM_QUERYENDSESSION (в противном случае оно вынудит систему прекратить попытку завершения работы), то после получения ответа на сообщение WM_ENDSESSION система в любом случае убьет приложение. Собственно, это нам мало что дает, т.к. мы и так знаем, что при получении сообщения WM_ENDSESSION приложение должно сохранять все данные и не возвращаться из процедуры обработки сообщения до того как.
У меня получается перехватить сообщение WM_ENDSESSION с помощью хука типа WH_CALLWNDPROC - в аккурат перед тем, как оно поступит окну ТК, так что выполнить сохранение состояния во время обработки хук-сообщения можно легко.
В общем, ловить сообщения в фоновом потоке не вышло, но натравить хук на поток ТК, в котором находится главное окно, получилось - моя хук-функция получает сообщение WM_QUERYENDSESSION.
Странно, что ТК молча схлопывается, получив сообщение WM_QUERYENDSESSION, при этом не выгружая модули - по идее, получив это сообщение, приложения должны лишь сказать, можно ли завершать работу, но никак не закрываться, тем более без сохранения данных. А тут я запускаю ТК, открываю блокнот, пишу там че-то (гарант того, что система не завершит работу по команде выключения - просто надо нажать Отмена на вопрос блокнота о закрытии), жму выключить комп, ТК закрывается (причем, судя по логу, без выгрузки модулей)...
В общем, я исследовал более подробно обработку сообщений WM_QUERYENDSESSION и WM_ENDSESSION и заметил, что если приложение возвращает 1 на WM_QUERYENDSESSION (в противном случае оно вынудит систему прекратить попытку завершения работы), то после получения ответа на сообщение WM_ENDSESSION система в любом случае убьет приложение. Собственно, это нам мало что дает, т.к. мы и так знаем, что при получении сообщения WM_ENDSESSION приложение должно сохранять все данные и не возвращаться из процедуры обработки сообщения до того как.
У меня получается перехватить сообщение WM_ENDSESSION с помощью хука типа WH_CALLWNDPROC - в аккурат перед тем, как оно поступит окну ТК, так что выполнить сохранение состояния во время обработки хук-сообщения можно легко.
В общем, путем перебора установленных в ТК модулей файловых систем и сверки их путей со своим удается определять имя модуля, так что команда cd работает.
Диалог конфигурации теперь запускается в отдельном потоке и не блокирует ТК, позволяя, например, копировать пути к файлам значков или писать скрипты, читая открытое окно с командами.
Virtual Panel 1.0.0.500:
+ поддержка внутренних ассоциаций в ТК 7.51 и более поздних
+ сохранение состояния при завершении работы Windows
+ корректный многопоточный доступ к виртуальной системе
+ немодальный диалог конфигурации
+ поддержка стандартной в ТК команды cd
Как обычно, надеюсь, ничего ранее работающего не сломал.
Диалог конфигурации теперь запускается в отдельном потоке и не блокирует ТК, позволяя, например, копировать пути к файлам значков или писать скрипты, читая открытое окно с командами.
Virtual Panel 1.0.0.500:
+ поддержка внутренних ассоциаций в ТК 7.51 и более поздних
+ сохранение состояния при завершении работы Windows
+ корректный многопоточный доступ к виртуальной системе
+ немодальный диалог конфигурации
+ поддержка стандартной в ТК команды cd
Как обычно, надеюсь, ничего ранее работающего не сломал.
- Вахмурка
- Сообщения: 2587
- Зарегистрирован: Пн дек 27, 2004 14:47
- Откуда: Большая деревня Москва
- Контактная информация:
...а также дележ шкуры неубитого медведяподдержка внутренних ассоциаций в ТК 7.51 и более поздних
С нетерпением ждем-с.
Работает! Ура! Ты гений!сохранение состояния при завершении работы Windows
А вот тут чегой-то не получаетя. Можно примерчиком в народ кинуть?поддержка стандартной в ТК команды cd
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Я вам не скажу за других медведей, но этот явно убит.Вахмурка писал(а):...а также дележ шкуры неубитого медведя
Даже самая богатая фантазия
Не представит себе наши безобразия.
Не представит себе наши безобразия.
Угу, ждем-с.Вахмурка писал(а):...а также дележ шкуры неубитого медведя
С нетерпением ждем-с.
Кстати, счастливые обладатели бет 7.51 могут проверить работоспособность функции уже сейчас.
Да уж, мутить хук ради ерунды. С ним еще проблемы были при установке одного и того же модуля под разными именами - ТК вылетал при выгрузке, т.к. один модуль грузился дважды, создавалось два хука, а т.к. пространство глобальных имен общее, выгружался лишь последний.Работает! Ура! Ты гений!
Да как же, запросто:А вот тут чегой-то не получаетя. Можно примерчиком в народ кинуть?поддержка стандартной в ТК команды cd
Код: Выделить всё
cd %temp%
cd "c:\documents and settings"%username%Код: Выделить всё
cd c:\
cd test
cd ..\test
cd \
cd \test\..
cd d:\windows- Вахмурка
- Сообщения: 2587
- Зарегистрирован: Пн дек 27, 2004 14:47
- Откуда: Большая деревня Москва
- Контактная информация:
Мистика какая-то. Мало того, что я твердо помню, что выдавал все эти команды, так еще и история командной строки, которая, в отличие от меня, склерозом не страдает, это подтвердила. Даже запросил номер релиза (<properties), чтобы убедиться, что посталена имена пятисотка. Так вот, тогда они не работали, что и побудило пожаловаться. А сейчас все пучком. Видно, перезагрузка помогла, иного объяснения не вижу. Так еще раз троекратное спасибо (третье, повторно - за "ерунду").
"Это не ерунда, это совсем даже не ерунда, дружище Биттнер. Особенно в таком деле!" ((С) группенфюрер Мюллер)
"Это не ерунда, это совсем даже не ерунда, дружище Биттнер. Особенно в таком деле!" ((С) группенфюрер Мюллер)
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
М-да, полтергейст прямо. Объяснить не могу, разве что винду ты замучал вконец, что она не пересылала сообщение WM_COPYDATA окну ТК)) или не давала VP создать фоновый поток для его пересылки.
Ну, про ерунду - это я образно. А так - согласен, что функция полезная, иначе бы фиг делал.
Многопоточный доступ у меня уже есть, можно потихоньку вводить еще один поток для сохранения базы с заданным интервалом времени.
Ну, про ерунду - это я образно. А так - согласен, что функция полезная, иначе бы фиг делал.
Многопоточный доступ у меня уже есть, можно потихоньку вводить еще один поток для сохранения базы с заданным интервалом времени.