Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.28;
Скачать: CL | DM;

Вниз

Получение EnvironmentStrings среды.   Найти похожие ветки 

 
Riply ©   (2009-03-23 09:32) [0]

Здравствуйте !

Задача такая:
при обычном старте приложения получить(создать)
такой же EnvironmentBlock, как и при запуске из под среды.
На руках имеем только путь в реестре к данной среде, например "Software\Borland\BDS\4.0\";

Дело в том, что при обычном старте не удается "проэкспандить", например, строку такого вида:
"%BDS%\lib;%BDSUSERDIR%\Imports;%BDS%\Imports;%BDS%\Lib\Indy10;%BDSCOMMONDIR%\Dcp;%BDS%\include;%BDS%\RaveReports\Lib"
что при работе из под среды проходит на ура :)
Т.е. нам надо получить как значения данных переменных, так и их имена (например BDSUSERDIR).

Если бы нам удалось создать этот блок, то мы могли бы спокойно "экспандить"
нужные нам пути, хотя бы с помощью RtlExpandEnvironmentStrings_U, которая первым параметром
может принимать данный блок (если я все правильно понимаю)

Порбовала поступать так:
находим DCC32.EXE соответствующей среды, запускаем его в SUSPENDED режиме
и "вытаскиваем" из него его EnvironmentBlock.
Я расчитывала на то, что раз он умеет собирать проекты, то должен и уметь "экспандить".
Меня постигла неудача: его блок не содержит необходимых переменных.

Есть еще интересный с этой точки зрения файл: CodeGear\RAD Studio\6.0\bin\rsvars.bat
с таким содержанием:
@SET BDS=C:\Program Files\CodeGear\RAD Studio\6.0
@SET BDSCOMMONDIR=C:\Documents and Settings\All Users\Documents\RAD Studio\6.0
@SET FrameworkDir=C:\WINDOWS\Microsoft.NET\Framework\
@SET FrameworkVersion=v2.0.50727
@SET FrameworkSDKDir=
@SET PATH=%FrameworkDir%%FrameworkVersion%;%FrameworkSDKDir%;%PATH%


но, с сожалению он присутствует не во всех версиях (например его нет в 2006)

Подскажите, пожалуйста, как еще можно извратиться для решения данной задачи ? :)

P.S.
Riply ворчит: наш форум так часто стал бывать "недоступным",
               что уже вопрос задать - целая эпопея.  :)


 
Юрий Зотов ©   (2009-03-23 17:11) [1]

Можно так:

1. Пишем вспомогательную программу, выводящую environment-переменные в файл (аналог команды set > env_vars.txt)

2. Запускаем эту вспомогательную программу из-под IDE.

3. Полученный файл ручками превращаем в батник с набором команд set:
set имя=значение

4. В начало этого батника пишем команду @echo off, а в конец - запуск нужной программы.


 
Игорь Шевченко ©   (2009-03-23 23:34) [2]


> при обычном старте не удается "проэкспандить", например,
>  строку такого вида:
> "%BDS%\lib;%BDSUSERDIR%\Imports;%BDS%\Imports;%BDS%\Lib\Indy10;
> %BDSCOMMONDIR%\Dcp;%BDS%\include;%BDS%\RaveReports\Lib"


А зачем так извращаться ?


 
Rouse_ ©   (2009-03-24 09:27) [3]


> А зачем так извращаться ?

Там вверху написано было, данные необходимы для парсера проектов, который без переменных окружения среды полноценно не сможет работать...


 
Rouse_ ©   (2009-03-24 09:49) [4]

Эмм, пардон... про парсер было написано на другом форуме :)
Тут действительно этого нет :)


 
Riply ©   (2009-03-24 16:55) [5]

[1] Юрий Зотов ©   (23.03.09 17:11)
> Можно так:

Спасибо.
Примерна так и поступила, только постаралась избавить себя от
"Полученный файл ручками превращаем в батник" ибо очень ленивая не люблю что-то делать руками :)

При старте под средой сохраняю EnvironmentBlock в файл.
При "простом" старте считываю соответствующий файл в память и
передаю указатель в RtlExpandEnvironmentStrings_U.
Вроде, все работает, но мне не нравиться
т.к. хоть раз да надо запустить среду для создания данного файла.

> [2] Игорь Шевченко ©   (23.03.09 23:34)

> А зачем так извращаться ?

Жизнь заставила при попытке повозиться с "dpr-парсилкой" :)


 
oxffff ©   (2009-03-25 09:44) [6]


> Жизнь заставила при попытке повозиться с "dpr-парсилкой"
> :)


Позвольте узнать что это за парсер.


 
Riply ©   (2009-03-25 11:23) [7]

> [6] oxffff ©   (25.03.09 09:44)
> Позвольте узнать что это за парсер.

Нуу..., примерно, что-то такое:
Дается нам dpr - файл (и возможно путь к среде)
Требуется пролучить всю возможную информацию о проекте
(списик всего что он использует, взамиосвязи и т.д. и т.п.)


 
oxffff ©   (2009-03-25 11:39) [8]


> Riply ©   (25.03.09 11:23)


Меня собственно интересует сам парсер, где его можно посмотреть, кто автор этого парсера, на какой грамматике основан LL или LR.


 
Игорь Шевченко ©   (2009-03-25 11:54) [9]

www.peganza.com


 
Rouse_ ©   (2009-03-25 12:44) [10]


> Игорь Шевченко ©   (25.03.09 11:54) [9]
>
> www.peganza.com

Интересная поделка, но она не смогла пропарсить ни один из наших текущих проектов, только какие-то простенькие вещи кушает :)


 
Игорь Шевченко ©   (2009-03-25 12:55) [11]

Rouse_ ©   (25.03.09 12:44) [10]


> Интересная поделка, но она не смогла пропарсить ни один
> из наших текущих проектов


Это о чем говорит ?


 
oxffff ©   (2009-03-25 13:08) [12]

Спасибо. Будем писать свое.


 
Riply ©   (2009-03-25 13:31) [13]

> [8] oxffff ©   (25.03.09 11:39)

> Меня собственно интересует сам парсер, где его можно посмотреть, кто автор этого парсера

Автор всего этого безобразия - Rouse_.
По всем вопросам к нему :)


 
Rouse_ ©   (2009-03-25 13:31) [14]


> Это о чем говорит ?

О том что продукт несовершенен.
Мне пришлось писать свой, который делает это достаточно нормально.


 
Игорь Шевченко ©   (2009-03-25 13:59) [15]

Rouse_ ©   (25.03.09 13:31) [14]


> Мне пришлось писать свой, который делает это достаточно
> нормально.


Можно ознакомиться ?


 
Rouse_ ©   (2009-03-25 14:32) [16]

Да в принципе можно...
Парсит только проекты от 2007-ой при установленной 2007-ой, остальное не кушает и выдает ошибку при получении переменных окружения. (собственно с этим Рипли чейчас и возится).

Картинка:
http://rouse.drkb.ru/other/uw.gif
Экзешник:
http://rouse.drkb.ru/other/unitweb.zip
Исходники щас пилит Рипли. у меня последней версии нет, та которая есть могу дать мылом, бо там пару модулей не совсем для паблика, нет времени отвязать...


 
Игорь Шевченко ©   (2009-03-25 14:44) [17]


> Экзешник:
> http://rouse.drkb.ru/other/unitweb.zip


А че он у тебя половину uses-ов не показывает ? :) Ограничение демо-версии ?


 
Rouse_ ©   (2009-03-25 14:59) [18]

Системные не показывает, задача была написать утилитку для фнутреннего рефакторинга, чтобы понять откуда унас цепляются ненужные модули, которых по логике вещей в конечном проекте быть не должно.

Поэтому все дельфевые юниты я не показываю.

Работает след образом. открываем проект, ждем пока распарсится. в леаой колонке выделяем имя юнита и смотрим на экране все модуля и ссылки между ними по которым может подтянуться этот юнит в проект. Если в этот момент щелкнуть на каком либо модуле в левой колонке постоится информация, кто на него ссылатся и на кого он. А так-же подсветяться красным ссылки на те юниты на которые ссылается выбранный модуль и синим те кто ссылается на него.


 
oxffff ©   (2009-03-25 15:04) [19]


> Rouse_ ©   (25.03.09 14:32) [16]


У тебя полноценный парсер и выдергиватель uses зависимостей?


 
oxffff ©   (2009-03-25 15:07) [20]


>  и выдергиватель uses зависимостей?


или выдергиватель uses зависимостей?
То есть в ... грамматику, ищем только uses в файликах.


 
oxffff ©   (2009-03-25 15:10) [21]

Rouse, как пользоваться твоей программой? :)
Выдает List index out of bounds(-1).


 
Rouse_ ©   (2009-03-25 15:10) [22]


> У тебя полноценный парсер и выдергиватель uses зависимостей?

До полноценного руки еще не дошли, пока только USES-ы, но в перспективе можно будет прикрутить парсер от JEDI, для четкого определения - за коим лешим на понадобился тот или иной юнит, с показом процедур и функций из-за которых используется каждый модуль в юзесах


 
Rouse_ ©   (2009-03-25 15:11) [23]


> как пользоваться твоей программой? :)

Пользоваться можно только в случае установленного Дельфи 2007 и только на проектах от 2007-ой :)


 
oxffff ©   (2009-03-25 15:12) [24]


> Rouse_ ©   (25.03.09 15:10) [22]


Есть еще pax compiler, можно взять за основу его исходники.


 
oxffff ©   (2009-03-25 15:12) [25]


> Rouse_ ©   (25.03.09 15:11) [23]
>
> > как пользоваться твоей программой? :)
>
> Пользоваться можно только в случае установленного Дельфи
> 2007 и только на проектах от 2007-ой :)


Я так и знал, что я что то не так делаю. :))))))


 
atruhin ©   (2009-03-25 15:17) [26]

Выдает
---------------------------
Unitweb
---------------------------
Ошибка парсинга модуля "pngimage.pas"
строка 5648:2
Не найден завершающий тэг: " #13 "
---------------------------

Вот кусок файла
   {$IFDEF UseDelphi}Canvas.Handle := NewDC;{$ENDIF}
   NewBytesPerRow := (((Header.BitmapInfo.bmiHeader.biBitCount * cx) + 31)
     and not 31) div 8;

   {Copies the image data}  <<<< вот эта строка № 5648
   for Line := 0 to Min(CY - 1, Height - 1) do


 
Игорь Шевченко ©   (2009-03-25 15:28) [27]


> Системные не показывает, задача была написать утилитку для
> фнутреннего рефакторинга, чтобы понять откуда унас цепляются
> ненужные модули, которых по логике вещей в конечном проекте
> быть не должно.
>
> Поэтому все дельфевые юниты я не показываю.


Причем тут системные ? Оно половину не дельфийских юнитов не показывает.

И еще - у Icarus есть крайне полезная фича - оно показывает, нужен ли uses конкретного модуля в интерфейсной части или его можно смело перенести в implementation, а также нужен ли uses модуля вообще или это следы предыдущей распущенной жизни.

А просто, кто что использует - это и в GExperts есть.


 
Rouse_ ©   (2009-03-25 15:29) [28]


> atruhin ©   (25.03.09 15:17) [26]

Не это строка, у меня там не закочен правильный рассчет ошибочной позиции.

Вот кусочек кода:

       #13:
       begin
         { TODO : Небольшой, но не критичный глюк,
           при вызове ClearNotUsedData не учитываются переводы каретки,
           поэтому при возникновении ошибки указываются неверные
           CurrentLine и CurrentPos.
           Вероятно их придется рассчитывать в динамике при вызове DoError}
         CurrentPos := 0;
         Inc(CurrentLine);
       end;

..

       "/": // убираем все коментарии вида // bla..bla
       if NextChar(ACursor) = "/" then
       begin
         APos :=
           PosByte(13, PByte(ACursor), 1, FFileSource.Size - I);
           //Pos(#13, ACursor);
         if APos = 0 then
           DoError(CurrentLine, CurrentPos, "#13");
         ClearNotUsedData(ACursor, I, APos - 1);
         Continue;
       end;


Такое может быть если у тебя разделителzvb между строк используется не полноценный CaretReturn + LineFeed а только LineFeed т.е. #10. или только CaretReturn #13

Кстати если такое проявляется, то в этом модуле плывут точки останова.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1025

Дай сам файлик pngimage - посомтрю где падает.


 
Rouse_ ©   (2009-03-25 15:31) [29]


> Причем тут системные ? Оно половину не дельфийских юнитов
> не показывает.

Если они не используются (отключены DEFINE-ами) то конечно не покажет.
А так я смотрел на своих проектах (около 500 с чем-то модулей) все отображается... Ну еще может быть если не смог найти правильный путь к PAS файлу - тогда такие файлы не учитываются конечно.


 
Игорь Шевченко ©   (2009-03-25 15:43) [30]

Rouse_ ©   (25.03.09 15:31) [29]


> Ну еще может быть если не смог найти правильный путь к PAS
> файлу - тогда такие файлы не учитываются конечно.


Ясно. К сожалению ценность такого инструмента мне представляется сомнительной. Для личного использования внутри конкретной компании - может быть, а для стороннего - нет смысла.


 
Rouse_ ©   (2009-03-25 15:58) [31]


> Для личного использования внутри конкретной компании - может
> быть, а для стороннего - нет смысла.

Так я и не планирую пока для внешнего, вот когда смогу заняться более плотно, тогда конечно и фукционал будет наращен соответствующим образом, благо сейчас Рипли помогает...


 
Riply ©   (2009-03-25 16:09) [32]

> [30] Игорь Шевченко ©   (25.03.09 15:43)
>> Ну еще может быть если не смог найти правильный путь к PAS
>> файлу - тогда такие файлы не учитываются конечно.

>Ясно. К сожалению ценность такого инструмента мне представляется сомнительной.

Это единственная причина "сомнительности" ?
Дело в том, что она временная, ибо если проект
компилируется, то будут вытащены все юниты (я надеюсь). :)
А если не компилируется по причине "не найден файл", то и сам господь бог не поможет :)


 
Игорь Шевченко ©   (2009-03-25 16:29) [33]


> Это единственная причина "сомнительности" ?


Нет, не единственная. Главная причина - это то, что такая функциональность есть в GExperts, ESSModel (вроде бы) и в продуктах Peganza. Причем все они бесплатны.

Красивые картинки никому не нужны, когда модулей становится больше 30 - собственно эту печальную картину я наблюдал только что, когда запустил на анализ проект, где половина юнитов не показывается - получил еще иллюстрацию на тему творчеста пауков.


 
Rouse_ ©   (2009-03-25 16:47) [34]


> иллюстрацию на тему творчеста пауков.

Вот это и есть главная причина :) Ибо не понятно как это все дело представить пользователю в юзабельном виде, поэтому я и ограничил построением связей от корня до конечного только одного юнита :)


 
Riply ©   (2009-03-25 17:05) [35]

> [34] Rouse_ ©   (25.03.09 16:47)

> Вот это и есть главная причина :)
> Ибо не понятно как это все дело представить пользователю в юзабельном виде

Нарисовать трехмерную, вращающуюся картинку
или лабиринт, по которому можно гулять :)
А можно сказать пользователю: "сам наплодил столько связей - сам и разбирайся" :)


 
Игорь Шевченко ©   (2009-03-25 17:11) [36]

Rouse_ ©   (25.03.09 16:47) [34]


> Ибо не понятно как это все дело представить пользователю
> в юзабельном виде


Как в Icarus-е например - длинное полотно с гиперссылками.

Riply ©   (25.03.09 17:05) [35]


> А можно сказать пользователю: "сам наплодил столько связей
> - сам и разбирайся" :)


В этом случае ценность вашего творчества стремится не к нулю, а к минус бесконечности.


 
Rouse_ ©   (2009-03-25 17:13) [37]


> Как в Icarus-е например - длинное полотно с гиперссылками.

Это абсолютно не юзабельно, у нас более 500 модулей на каждый проект... ничего понять в таком виде не возможно :(


 
Игорь Шевченко ©   (2009-03-25 17:19) [38]


> Это абсолютно не юзабельно, у нас более 500 модулей на каждый
> проект... ничего понять в таком виде не возможно :(


а паутина из даже не 500, а 50 модулей - натурально юзабельно.
Впрочем, что я буду советовать - делай, как считаешь нужным :)
Я ж говорю - внутри конторы оно может и ничего, если напильником доработать.


 
atruhin ©   (2009-03-25 17:24) [39]

> [33] Игорь Шевченко ©   (25.03.09 16:29)
> Главная причина - это то, что такая функциональность есть
> в GExperts, ESSModel (вроде бы) и в продуктах Peganza.

О ESSModel, Peganza не знаю, а что касается GExpert:
1. там довольно неудобное представление, по крайней мере я не нашел как вывести весь список используемых модулей.
(если это возможно подскажите, а то у меня отображает только в виде дерева от модулей напрямую включенных в проект)
2. У меня он не увидел половину модулей.


 
Rouse_ ©   (2009-03-25 17:24) [40]


> а паутина из даже не 500, а 50 модулей - натурально юзабельно.

Ну так там-же фильтруется все при выборе модуля из левого списка :)

Ладно, чего спорить-то, функционала у утилиты сейчас все равно сильно толкового нет, поэтому...


 
atruhin ©   (2009-03-25 17:26) [41]

> [37] Rouse_ ©   (25.03.09 17:13)

Файлик отправил, вообще он из стандарной http://pngdelphi.sourceforge.net


 
Игорь Шевченко ©   (2009-03-25 17:33) [42]

atruhin ©   (25.03.09 17:24) [39]


> 1. там довольно неудобное представление, по крайней мере
> я не нашел как вывести весь список используемых модулей.
>
> (если это возможно подскажите, а то у меня отображает только
> в виде дерева от модулей напрямую включенных в проект)


Во-первых, я этим экспертом не пользуюсь (потому как есть Icarus от Peganza)
Во-вторых, GExperts сейчас у меня не установлен - увы, помочь не могу, а устанавливать не хочу.

Rouse_ ©   (25.03.09 17:13) [37]

А какой, кстати, функционал планируется ?

Другими словами, зачем вы это делаете ? :)


 
Rouse_ ©   (2009-03-25 17:34) [43]


> atruhin ©   (25.03.09 17:26) [41]

Угу посмотрел, падает на последней строчке:
//862fd5d6aa1a637203d9b08a3c0bcfb0
Он считает ее коментарием (что логично) и ищет конца строки (CRLF) которого нет...
ЗЫ: а вообще раньше на сколько я помню если писать коментарии после END. выводился ворнинг :)


 
Rouse_ ©   (2009-03-25 17:39) [44]


> А какой, кстати, функционал планируется ?
>
> Другими словами, зачем вы это делаете ? :)

Пфф... Анализатор проекта который будет отображать взаимосвязи, искать ненужные (лишние) uses, показывать места в коде где именно применяется определенный модуль из юзесов.
Все это только для облегчения рефакторинга в сложных проектах...
Пока написан только каркас, но несмотря на это даже в таком виде этот каркас смог помочь нам более менее понять как надо рефакторить весь наш зоопарк.
Если придумать, как это сделать максимально юзабельно, то может что-то и публичное получиться.


 
Rouse_ ©   (2009-03-25 17:42) [45]

Ах, ну да - все это хочется сделать таким образом чтобы перед глазами сразу выстраивалась четкая картинка на одном экране без лишней информации и не нужно было проходить через дебри данных пытаясь понять что к чему.


 
Игорь Шевченко ©   (2009-03-25 17:47) [46]

Rouse_ ©   (25.03.09 17:39) [44]


> Анализатор проекта который будет отображать взаимосвязи,
>  искать ненужные (лишние) uses, показывать места в коде
> где именно применяется определенный модуль из юзесов.
> Все это только для облегчения рефакторинга в сложных проектах.
> ..


Удачи. Лет через 5 вернемся к дискуссии


 
atruhin ©   (2009-03-25 17:59) [47]

> [43] Rouse_ ©   (25.03.09 17:34)

Еще на одном файле, из этой же библиотеки спотыкается. Отправил.

> [42] Игорь Шевченко ©   (25.03.09 17:33)
> потому как есть Icarus от Peganza

Попробовал. Отработал нормально, нашел все модули, но как разбираться в этом файле, почти 600 кб.?
Каждый модуль искать поиском, смотреть и искать опять? Ни перекресных ссылок, ни фильтрации. :(
А так, при нужде, хороший продукт, формировал бы еще html с гиперссылками.


 
Игорь Шевченко ©   (2009-03-25 18:02) [48]

atruhin ©   (25.03.09 17:59) [47]


> формировал бы еще html с гиперссылками.


вроде формирует. Вроде можно в его простыню мышью тыкать и произойдет переход.


 
Palladin ©   (2009-03-25 18:04) [49]


> Удачи. Лет через 5 вернемся к дискуссии

Записал себе в календарь на смарте :)


 
Rouse_ ©   (2009-03-25 18:09) [50]


> atruhin ©   (25.03.09 17:59) [47]
>
> > [43] Rouse_ ©   (25.03.09 17:34)
>
> Еще на одном файле, из этой же библиотеки спотыкается. Отправил.
>

Угу, спасибо...
Тут сам файл с ошибкой: 329-ая строка...
Одна кавычка.
 EPNGCannotAssignChunkText = Koљcki morajo biti med seboj kompatibilni za prireditev vrednosti.";


 
Eraser ©   (2009-03-25 18:59) [51]

небольшой оффтоп, раз уже про png заговорили.
кто знает, как с помощью стандартного TPngImage сохранить картинку в формате png-8?


 
Leonid Troyanovsky ©   (2009-03-26 20:36) [52]


> Riply ©   (23.03.09 09:32)  

> Т.е. нам надо получить как значения данных переменных, так
> и их имена (например BDSUSERDIR).

Одну из загадок разгадать можно: byDelphi help: Search|Find in Files:
To search for files in the product root directory, use $(DELPHI) to specify the
directory. For example, to search all the include files, use $(DELPHI)\include;
to search the examples directories, use $(DELPHI)\demos\*.pas.

Ну, это, ясное дело, речь про BDS :)

--
Regards, LVT.


 
Riply ©   (2009-04-03 06:25) [53]

> [52] Leonid Troyanovsky ©   (26.03.09 20:36)
> Ну, это, ясное дело, речь про BDS :)

Я тож такой магический кристал хочу :)
$(DELPHI) осталось неизменной во всех версиях (Delphi7, Turbo, 2006, 2007, 2009),
даже в тех, где она(переменная) не используется :)
Соответственно, может служить индикатором.

Если кому интересно:
Задачка решилась следующим образом:
Запускаем среду в суспендед режиме.
Добавляем APC процедурку, в котрой подгружаем библиотекку, перехватывающую RtlSetEnvironmentVariable.
Резьюмим процесс.
Ждем добавления в блок окружения $(DELPHI) и активизируем Event окончания работы.
Во всех версиях, в этот момент блок переменных уже полностью сформирован.
Вытаскиваем его и наслаждаемся жизнью :)



Страницы: 1 2 вся ветка

Текущий архив: 2010.02.28;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.015 c
2-1261750036
Андрей Пл
2009-12-25 17:07
2010.02.28
как программно прервать процесс до наступления опред. события?


2-1261668633
alex123
2009-12-24 18:30
2010.02.28
Connect через svchost.exe


6-1213366187
JanMihail
2008-06-13 18:09
2010.02.28
Новое письмо на Email ???


1-1238629573
Opilki_Inside
2009-04-02 03:46
2010.02.28
Непонятное поведение accelerator character


15-1250439668
TIF
2009-08-16 20:21
2010.02.28
Обсуждение Delphi 2010 | RAD Studio 2010 (Weaver)