-
Здравтсвуйте. Вопрос по экспертам. Кто-нибудь может подсказать, как имея ссылку на проект (IOTAProject), определить, что проект - это DLL? Заранее спасибо.
-
> [0] Инс © (10.09.07 23:09) http://www.delphiplus.org/articles/expert/toolsapi/и там Работа с проектами От туда: Чтобы получить указатель на этот интерфейс необходимо сначала получить указатель IOTAProject на любой из проектов, открытых в IDE. Рассмотрим абстрактную реализацию: procedure EnumCurrentProjectFiles(Project : IOTAProject); var i: integer; ModuleInfo: IOTAModuleInfo; begin for j := 0 to Project.GetModuleCount - 1 do begin ModuleInfo := Project.GetModule(j); ShowMessage(ModuleInfo.FileName) ; end; end;
В отличие от IOTAModule, указатель на IOTAModuleInfo можно всегда получить на любую единицу группы проектов, отрытых в IDE. Фактически, эта информация отображена в Project Manager среды разработки. Интерфейс IOATModuleInfo может вернуть полное имя файла, тип модуля, имя формы, дизайн-класс формы. Также интерфейс содержит метод для открытия файла в редакторе IDE, что тоже важно.
Не оно?
-
Пошарил по ToolsAPI и вот что нашел:
GetModuleCount
Далее:
if GetModule(i).GetModuleType = omtLib then...
-
{RASkov} © и Юрий Зотов ©: Я тоже это нашел... Хотелось бы мне, чтобы это было то, что нужно, но боюсь, это не оно. Для проекта DLL перечисление в цикле GetModule возвращает только то, что записано в uses этой библиотеки. Делаем в событии при создании проекта: for i:=0 to Project.GetModuleCount - 1 do begin
ShowMessage(Project.GetModule(i).GetName);
end; Создаю проект DLL и получаю два сообщения: 'SysUtils' и 'Classes' :(
-
> [3] Инс © (11.09.07 01:27)
Я далек от этого... к сожалению, но можно вопрос? А что тот же самый код показывает у обычного проекта (т.е. *.exe)? Т.е. я хотел спросить - это только у DLL такой "глюк" или нет....
По логике вообще-то.... должен модули проекта перечислять, а не модули в конкретном модуле.... я так понял.
-
> А что тот же самый код показывает у обычного проекта (т.е. > *.exe)?
То, что перечислено в uses файла проекта dpr. Это не глюк. Это документированное поведение. Метод GetModule возвращает модули, являющиеся дочерними по отношению к данному. По идее, проект является дочерним модулем к группе проектов, но у интерфейса IOTAProjectGroup нет аналогичного метода. Собственно в этом и вопрос, как все-таки узнать, что проект - это DLL.
-
> По идее, проект является дочерним модулем к группе проектов
Вон оно что.... Ясно. Но все это как-то странно > Метод GetModule возвращает модули, являющиеся дочерними > по отношению к данному
Но мы вызываем это у модуля "проект"(не dpr). Т.е. дочерние должны быть dpr, pas, dfm.... или я чего-то не так понимаю. Вот тут есть перевод (возможно не правильный... или возможно я не правильно понял:( ) http://www.vrsi.ru/modules/wfsection/article.php?articleid=2Например: IOTAProject Интерфейс предоставляет доступ к проекту. IOTAProject40 = interface(IOTAModule) function GetModuleCount: Integer; function GetModule(Index: Integer): IOTAModuleInfo; ...... end; IOTAProject = interface(IOTAProject40) ....... end;
GetModuleCount возвращает число модулей проекта GetModule возвращает информацию о заданном модулеВедь логично, что у группы проектов кроме проектов ничего нет, поэтому у группы только перечисление проектов, которые, в свою очередь, состоят из модулей. IOTAModuleInfo Интерфейс предоставляет информацию о модуле. IOTAModuleInfo50 = interface(IUnknown) ..... end; IOTAModuleInfo = interface(IOTAModuleInfo50) ..... end; GetModuleType возвращает тип модуля GetName возвращает имя модуля в IDE GetFileName возвращает имя файла модуля на диске GetFormName возвращает имя формы GetDesignClass возвращает имя класса дизайнера GetCoClasses заполняет Strings co-class’ами (только для библиотек типов и проч.) OpenModule открывает модуль и возвращает его интерфейс.В общем... я что-то запутался :( Но если это так: > Метод GetModule возвращает модули, являющиеся дочерними > по отношению к данному. По идее, проект является дочерним > модулем к группе проектов, но у интерфейса IOTAProjectGroup > нет аналогичного метода
тогда получается, что невозможно узнать тип конкретного модуля в проекте..... но я не верю в это :) ЗЫ Эх... ну и путаница :)
-
Добавлю к [6] И вот еще что получается, если следовать примеру [3] т.е. > Метод GetModule возвращает модули, являющиеся дочерними > по отношению к данному. По идее, проект является дочерним > модулем к группе проектов, но у интерфейса IOTAProjectGroup > нет аналогичного метода
> и получаю два сообщения: 'SysUtils' и 'Classes'
> То, что перечислено в uses файла проекта dpr
то выходит так, что GetModule у IOTAProject как таковой не нужен, так как он будет все время возвращать тип pas т.е. utUnit или omtUnit(как-то так... Делфи уже закрыл). Ведь в uses кроме pas ничего нет..... В общем.... глубокое это болото, toolsapi :)
-
> GetModule у IOTAProject
Имелось в виду GetModuleType у IOTAModuleInfo
-
IOTAProject.ProjectOptions.TargetName ?
-
> [9] Lacmus © (11.09.07 18:07)
Это гораздо ближе. В принципе, мне бы подошло, но вот нужно для D7, а то, о чем вы горорите, появилось только в D8. Сплошная невезуха! Мне тут в принципе одну ссылочку дали, посмотрю ее.
-
> [10] Инс © (11.09.07 18:28)
А что, все мои мысли бред? :) Я просто не могу пока проверить, ввиду того, что никогда не занимался написанием експертов, основывался на логике и найденной инфы как в интернете так и в ToolsAPI.... ЗЫ Просто стало очень интересно. Тема достойная внимания :) ЗЫЫ Инс, если найдешь решение - поделись инфой в этой ветке, может и пригодится...
-
Проблема решена, вот ссылка на пример, где можно выдернуть нужные функции: http://cc.codegear.com/Item.aspx?id=19823 > [11] {RASkov} © (11.09.07 21:18)
Да нет, почему бред. Все действительно несколько запутано, по крайней мере на первый взгляд. Спасибо, что потратили свое время, пытаясь помочь :)
-
> [12] Инс © (11.09.07 21:39)
Да уж.... до такого бы я точно не додумался бы) if Project.ProjectOptions.Values['GenDll'] then // DLL :)) Хотя в мыслях было что это возможно через ProjectOptions или IOTAEditor, но мне показалось, что это будет "не красиво" :)
-
> if Project.ProjectOptions.Values['GenDll'] then // DLL
Это еще не все, там сложнее, просто проверка на GenDll выдаст true и для пакетов.
-
> [14] Инс © (11.09.07 22:25) > просто проверка на GenDll выдаст true и для пакетов.
??? А зачем же тогда вот это все: if Result = '' then
begin
if Project.ProjectOptions.Values['GenPackage'] then Result := '.bpl'
else if Project.ProjectOptions.Values['GenDll'] then Result := '.dll'
else Result := '.exe';
end;
-
Черт его знает. :) Надо с этим поразбираться. Видимо нужно проверять сначала на bpl, и только в случае отрицательного ответа - на dll. В принципе, можно поэкспериментировать. На этом тему считаю закрытой, всем спасибо!
|