Конференция "Компоненты" » Определить, что проект - библиотека DLL
 
  • Инс © (10.09.07 23:09) [0]
    Здравтсвуйте. Вопрос по экспертам. Кто-нибудь может подсказать, как имея ссылку на проект (IOTAProject), определить, что проект - это DLL? Заранее спасибо.
  • {RASkov} © (11.09.07 00:44) [1]
    > [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, что тоже важно.

    Не оно?
  • Юрий Зотов © (11.09.07 00:50) [2]
    Пошарил по ToolsAPI и вот что нашел:

    GetModuleCount

    Далее:

    if GetModule(i).GetModuleType = omtLib then...
  • Инс © (11.09.07 01:27) [3]
    {RASkov} © и Юрий Зотов ©:

    Я тоже это нашел... Хотелось бы мне, чтобы это было то, что нужно, но боюсь, это не оно. Для проекта DLL перечисление в цикле GetModule возвращает только то, что записано в uses этой библиотеки. Делаем в событии при создании проекта:
    for i:=0 to Project.GetModuleCount - 1 do begin
     ShowMessage(Project.GetModule(i).GetName);
    end;


    Создаю проект DLL и получаю два сообщения: 'SysUtils' и 'Classes' :(
  • {RASkov} © (11.09.07 01:37) [4]
    > [3] Инс ©   (11.09.07 01:27)

    Я далек от этого... к сожалению, но можно вопрос?
    А что тот же самый код показывает у обычного проекта (т.е. *.exe)?
    Т.е. я хотел спросить - это только у DLL такой "глюк" или нет....

    По логике вообще-то.... должен модули проекта перечислять, а не модули в конкретном модуле.... я так понял.
  • Инс © (11.09.07 01:42) [5]

    > А что тот же самый код показывает у обычного проекта (т.е.
    > *.exe)?

    То, что перечислено в uses файла проекта dpr. Это не глюк. Это документированное поведение. Метод GetModule возвращает модули, являющиеся дочерними по отношению к данному. По идее, проект является дочерним модулем к группе проектов, но у интерфейса IOTAProjectGroup нет аналогичного метода. Собственно в этом и вопрос, как все-таки узнать, что проект - это DLL.
  • {RASkov} © (11.09.07 03:29) [6]
    > По идее, проект является дочерним модулем к группе проектов

    Вон оно что....
    Ясно.

    Но все это как-то странно

    > Метод 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
    > нет аналогичного метода

    тогда получается, что невозможно узнать тип конкретного модуля в проекте..... но я не верю в это :)
    ЗЫ Эх... ну и путаница :)
  • {RASkov} © (11.09.07 03:50) [7]
    Добавлю к [6]
    И вот еще что получается, если следовать примеру [3] т.е.
    > Метод GetModule возвращает модули, являющиеся дочерними
    > по отношению к данному. По идее, проект является дочерним
    > модулем к группе проектов, но у интерфейса IOTAProjectGroup
    > нет аналогичного метода

    > и получаю два сообщения: 'SysUtils' и 'Classes'

    > То, что перечислено в uses файла проекта dpr

    то выходит так, что GetModule у IOTAProject как таковой не нужен, так как он будет все время
    возвращать тип pas т.е. utUnit или omtUnit(как-то так... Делфи уже закрыл).
    Ведь в uses кроме pas ничего нет..... В общем.... глубокое это болото, toolsapi :)
  • {RASkov} © (11.09.07 13:38) [8]
    > GetModule у IOTAProject

    Имелось в виду
    GetModuleType у IOTAModuleInfo
  • Lacmus © (11.09.07 18:07) [9]
    IOTAProject.ProjectOptions.TargetName ?
  • Инс © (11.09.07 18:28) [10]

    > [9] Lacmus ©   (11.09.07 18:07)

    Это гораздо ближе. В принципе, мне бы подошло, но вот нужно для D7, а то, о чем вы горорите, появилось только в D8. Сплошная невезуха! Мне тут в принципе одну ссылочку дали, посмотрю ее.
  • {RASkov} © (11.09.07 21:18) [11]
    > [10] Инс ©   (11.09.07 18:28)

    А что, все мои мысли бред? :)
    Я просто не могу пока проверить, ввиду того, что никогда не занимался написанием експертов,
    основывался на логике и найденной инфы как в интернете так и в ToolsAPI....
    ЗЫ Просто стало очень интересно. Тема достойная внимания :)
    ЗЫЫ Инс, если найдешь решение - поделись инфой в этой ветке, может и пригодится...
  • Инс © (11.09.07 21:39) [12]
    Проблема решена, вот ссылка на пример, где можно выдернуть нужные функции:
    http://cc.codegear.com/Item.aspx?id=19823


    >  [11] {RASkov} ©   (11.09.07 21:18)

    Да нет, почему бред. Все действительно несколько запутано, по крайней мере на первый взгляд. Спасибо, что потратили свое время, пытаясь помочь :)
  • {RASkov} © (11.09.07 22:17) [13]
    > [12] Инс ©   (11.09.07 21:39)

    Да уж.... до такого бы я точно не додумался бы)
    if Project.ProjectOptions.Values['GenDll'] then // DLL
    :))
    Хотя в мыслях было что это возможно через ProjectOptions или IOTAEditor, но мне показалось, что это будет "не красиво" :)
  • Инс © (11.09.07 22:25) [14]

    > if Project.ProjectOptions.Values['GenDll'] then // DLL

    Это еще не все, там сложнее, просто проверка на GenDll выдаст true и для пакетов.
  • {RASkov} © (11.09.07 22:41) [15]
    > [14] Инс ©   (11.09.07 22:25)
    > просто проверка на GenDll выдаст true и для пакетов.

    ???
    А зачем же тогда вот это все:
     if Result = '' then
     begin
       if Project.ProjectOptions.Values['GenPackage'] then // Вот - package
         Result := '.bpl'
       else if Project.ProjectOptions.Values['GenDll'] then // Вот - DLL
         Result := '.dll'
       else // application
         Result := '.exe';
     end;

  • Инс © (11.09.07 23:57) [16]
    Черт его знает. :) Надо с этим поразбираться. Видимо нужно проверять сначала на bpl, и только в случае отрицательного ответа - на dll. В принципе, можно поэкспериментировать. На этом тему считаю закрытой, всем спасибо!
 
Конференция "Компоненты" » Определить, что проект - библиотека DLL
Есть новые Нет новых   [134427   +38][b:0][p:0.001]