Главная страница
    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 модулей - натурально юзабельно.

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

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



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

Форум: "Основная";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.009 c
2-1261763355
Pup
2009-12-25 20:49
2010.02.28
простейшие фигуры с помощью TShape


2-1261679750
TComponent
2009-12-24 21:35
2010.02.28
Позиция курсора в ячейке DBGrid


1-1238564083
EgorovAlex
2009-04-01 09:34
2010.02.28
Как правильно прочитать значение из IADsUser


13-1124537487
jenbond
2005-08-20 15:31
2010.02.28
Передача параметра из UserControl


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский