Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];

Вниз

Получение 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.006 c
2-1261726198
oleg1963
2009-12-25 10:29
2010.02.28
Добавить компонент в класс


15-1260989873
Kuper7777
2009-12-16 21:57
2010.02.28
Работа с dll-библиотеками


2-1261660012
Pup
2009-12-24 16:06
2010.02.28
Запуталась с integer, real, extented и т.д. =(


4-1229369994
DenisArd
2008-12-15 22:39
2010.02.28
Загрузка иконок


15-1260821412
Elnino
2009-12-14 23:10
2010.02.28
Хранение файлов в БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский