Страницы: 1
RSS
Работа с переменными окружения Windows, Использование переменных окружения Windows для передачи данных между приложениями и возникающие проблемы
 
Привет, народ! Давненько я на Планете не появлялся. Всё не до программирования было, да и на Андроид подсел.
А тут понадобилось обеспечить передачу небольших текстовых массивов (несколько десятков элементов) для заполнения  ListBox между разными приложениями.
Использовать создание/удаление текстового файла, а уж тем более  использование именованного диапазона памяти на компе для такой простой  задачи мне показалось избыточным. Вот я на переменные окружения и  посмотрел.
Стандартная функция Environ для этой цели не подходит, т.к. только читает переменные окружения, да и то далеко не все.
А вот в CreateObject("WScript.Shell").Environment("USER") можно как добавлять собственные, так и удалять не нужные переменные. (Переменные типов "SYSTEM", "VOLATILE","PROCESS" доступны только для чтения).
По ходу дела для сравнения переменных, доступных через Environ и Environment написал две процедурки, создающие в текущей книге листы со списками переменных окружения и их значениями
ENVIRION_Excel_Sheet
ENVIROMENTS_Excel_Sheet
Если возникнет ошибка при обращении к функции листа ТРАНСП (у некоторых это бывает), то можно использовать и чуть более сложный вариант с обработкой массива циклом:
ENVIROMENTS2_Excel_Sheet
Ну а теперь о возникшей странной проблеме при использовании Environment("USER").
Передача стрингов через них получается не сложно и устойчиво работает. Вот только удивляют большие задержки при создании переменной и её последующем удалении.
Стал анализировать. При счёте времени по Timer получил не только не повторяющиеся, но и вообще странные результаты. Мало того, что длительность процедур сильно плавает от теста к тесту, но при чтении она каким-то образом вообще иногда получается отрицательной!
Для проверки прицепил ещё и счёт времени через API
Длительности процессов, полученных через Timer и GetTickCount получаются разные! Отрицательных значений GetTickCount, правда не даёт, но и нулевые как-то напрягают.
Вот код, который я использовал для проверки длительности:
test_ENVIROMENT_READ_WRITE
А вот такие хитрые результаты этот тест выдаёт в окне Immediate
Задержки создания-чтения-удаления переменной окружения
Ничего не понимаю!
Неделю назад в Миру создал топик Работа с переменными окружения Windows для обсуждения данного вопроса.
Но что-то никто из знатоков этот феномен так и не объяснил.
P.S. Файл с процедурами, к сожалению, с работы выложить не могу: собаки-сисадмины, маньяки, макросы из интранета наружу не выпускают.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Привет! Timer дает число типа Single, а ты присваиваешь его переменной типа Long. Если происходит округление в бОльшую сторону, потом возможна отрицательная разность.
Объяви Dim lTimer! , и странность исчезнет.
Windows - не ОС реального времени, длительность обращения к системным переменным никто не регламентирует ;)
Изменено: Казанский - 06.12.2016 10:31:40
 
Привет, Андрей! (память на имена меня ещё не подвела или уже пора лечиться?)
Да, с лонг для таймера - это я, конечно, лоханулся немного.
Спасибо за подсказку. Теперь значения GetTickCount и Timer практически совпадают и отрицательные значения, возникающие из-за округления, глаза не мозолят.
Практически мгновенное чтение - это, конечно, отлично.
Но вот то, что переменная так долго создаётся и удаляется - это не есть хорошо. Надо будет попробовать Process Monitor'ом посмотреть, что там в системе происходит.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Тут в Миру мне показали, как используя API можно добавлять собственные переменные типа PROCESS.
Большое достоинство этого метода - то, что отличная получается скорость создания/записи/чтения, да ещё и бонус есть - переменные этого типа умирают вместе с закрытием процесса, т.е. не надо заботиться об их удалении с целью незасирания со временем списка.
Только боюсь, что они могут оказаться не доступны из других процессов. А мне нужно было данные из Excel в Visio и обратно передавать...
Надо будет попробовать. (На Visio я пока с переменными окружения не пробовал работать, уж больно там дебильная объектная модель приложения!)
test_ENVIROMENT_READ_WRITE_API
Но до чего же не люблю я API  :evil:  Их в отличие от VBA запомнить невозможно, а нужно тупо как иероглифы из справочника дёргать. Да и процедуры с их использованием получаются размазанными по всему модулю: сама процедура в одном месте листинга, а API-шки для неё - в декларациях. Копирнёшь куда-нибудь процедуру, а про декларации забудешь...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Цитата
Alex_ST написал:
Да и процедуры с их использованием получаются размазанными по всему модулю: сама процедура в одном месте листинга, а API-шки для неё - в декларациях. Копирнёшь куда-нибудь процедуру, а про декларации забудешь...
Создай класс.
There is no knowledge that is not power
 
Цитата
Alex_ST написал:
Использовать создание/удаление текстового файла, а уж тем более  использование именованного диапазона памяти на компе для такой простой  задачи мне показалось избыточным.
Текстовый файл в специально отведенной для этого временной папке (environ("temp")) - почему бы и нет?
А как насчет реестра? В VBA/VB6 есть операторы и функции для работы со специально отведенной веткой реестра: F1 - Registry Keyword Summary
В других языках средства доступа к реестру тоже должны быть, например в VBS CreateObject("WScript.Shell").RegRead и т.д.
 
Цитата
Alex_ST написал:
боюсь, что они могут оказаться не доступны из других процессов
Здравствуйте. Есть реализация чтения/записи переменных чужого процесса на плюсах, на VBA как-то не встречалось
 
Ну, вообще-то тормозят только процессы создания/убиения переменной. А чтение/запись идут очень быстро. Так что в принципе же никто не мешает создавать переменную (или даже сразу несколько, про запас) один раз, например, при запуске Excel. Ну удлинится ОДИН РАЗ его открытие на 1,5-2 секунды. Да и Бог с ним. Зато потом никаких тормозов при чтении/записи не будет и делается это достаточно просто.
А т.к. при каждом запуске будет обращение к одной и той же (одним и тем же) переменной (-ым), то и множиться их число не будет, а один раз возрастёт, а потом будет неизменным. Так что даже ни к чему убивать созданные переменные. Пусть висят.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1
Читают тему
Наверх