Конференция "WinAPI" » Встраиваемые приложения [D7, WinXP]
 
  • boris3b (28.10.08 12:33) [0]
    Задача: Из приложения [B]А[/B] запускается приложение [B]В[/B] посредством CreateProcess. Хитрым способом получаю Handle приложения [B]В[/B]. Отправляю приложению [B]В[/B] некую команду (строку), в которой передаю Handle приложения [B]А[/B] и Handle панели этого приложения. Приложение [B]В[/B] получив команду меняет своё ParentWindow на Handle панели.
     В итоге приложение [B]В[/B] как бы встраивается в приложение [B]А[/B], НО если перебрать все контролы и компоненты панели, на которую встроилось приложение [B]В[/B], то там ничего нет. Соответственно не работают ни какие ограничения (Constraints) приложения [B]В[/B]. Получается полное Г.

    Вопрос: Как грамотно из одной проги запустить другую и [U]правильно[/U] встроить её на панель первой проги.
  • tesseract © (28.10.08 12:36) [1]
    А зачем вообще такие махинации, зачем вообще делать исполнимый файл ?  

    ISpecifyPropertyPage в DLL и никакого шаманства.
  • boris3b (28.10.08 12:44) [2]
    Что такое ISpecifyPropertyPage?
    Суть моей задачи следующая: есть приложение, которое будет у каждого юзера (клиент). Это приложение получает из БД список других доступных приложений и создает соответственно кнопки для их запуска. Нажав на такую кнопку должно запуститься требуемое приложение и встроиться в данного клиента. В итоге можно потихоньку создавать новые проги для решения различных задач и добавлять инфо о них в БД. А клиент со временем не меняется.
  • Сергей М. © (28.10.08 13:01) [3]

    > получаю Handle приложения


    Как можно получить то чего не существует в природе ?
  • boris3b (28.10.08 13:14) [4]

    > Как можно получить то чего не существует в природе ?


    Лучше бы по делу чего сказал, чем к словам придираться!

    Пусть будет "Handle окна, в котором запущено приложение"
  • Сергей М. © (28.10.08 13:19) [5]

    > Пусть будет "Handle окна, в котором запущено приложение"
    >


    И это тоже не существует в природе.
  • tesseract © (28.10.08 16:36) [6]

    > Что такое ISpecifyPropertyPage?


    Справка не работает ? Это такой COM-интерфейс для встривания в GUI - например в панель управления в настройки мыши / клавиатуры пихаеться параметры от того же logitech - это стандартная модель. И кстати функциональность к интерфейсу ну никак не привязана.

    Ты сейчас занимаешься полной бессмыслицей, ты где нибудь плагин в виде exe видел ?. Для таких дел существует COM/DCOM и дитя их ActiveX. DCOM кстати совершенно по барабану на какой машине он запущен. Да и хранить файлы в базе тоже не кайф.


    > В итоге можно потихоньку создавать новые проги для решения
    > различных задач


    Жаргоничик студенческий. В общем тебе нужно смотреть на COM/ActiveX или .Net сборки.
  • boris3b (28.10.08 16:58) [7]

    > Жаргоничик студенческий


    Несколько обидная фраза - года уже не те. Года 3 назад разбирался с ActiveX и делал ActiveX Form, но очень хотелось бы, чтоб всё работало без дополнительных dll и ActiveX. Появилась в БД запись о новой программе -> при запуске клиента скачивается готовый exe-файл -> запускается и встраивается в клиента.
     Вся нагрузка на клиента - это предоставление списка доступных программ, их запуск/завершение и слежение за местоположением/размерами относительно клиента.
     Пример - на FreeBSD есть программа Contact. Она содержит в себе контакты персон, почту, календарь, задачи/проекты... Во время работы данной программы, если посмотреть список выполняемых процессов, то видно, что каждая - это отдельный процесс. Отсюда и возникла моя "бредовая" идея - как сделать программу масштабируемой. Т.е. сегодня я еще не знаю, какую задачу мне надо будет реализовать завтра, но условие, чтобы всё запускалось из одной программы уже поставлено.
  • Сергей М. © (28.10.08 17:03) [8]
    Да запускай себе на здоровье что угодно где угодно !

    Но причем здесь какое-то там "встраивание" ?


    > Соответственно не работают ни какие ограничения (Constraints)


    Ты ни шиша не понимаешь работы этого свойства.
    Вот с изучения оного и начни, прежде чем обижаться.
  • boris3b (28.10.08 17:33) [9]

    > Ты ни шиша не понимаешь работы этого свойства.


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

    У меня в принципе уже всё работает. Если есть ещё силы обсуждать - давай попробуем...

    Все контролы приложения В расположены на одной панели. При получении некой строковой команды от прил.А данная панель меняет своё ParentWindow на Handle панели приложения А. Теперь визуально кажется, что программа одна. Это я и называю встраиванием (заголовок на TaskBar я прячу).
    Далее при изменении размеров панели прил.А по средствам передачи строковых команд меняет свое местоположение и размеры панель прил.В.

    Теперь ставим панели прил.B constraints.MinWidth := 400; Когда я уменьшаю ширину прил.А уменьшается и прил.В, пока оно не станет = 400. Далее прил.В ужЕ Уже не станет, а прил.А об этом ни чего не знает.
     На этом месте я застопорился. Можно конечно далее перекидывать всякие команды между приложениями, но понимаю, что это всё криво и не правильно.
     Мне казалось, что если я делаю Panel1.ParentWindow := Panel2.Handle, то у Panel2 должно было увеличиться ControlCount, а на практике такого не случилось. Также мне кажется, что если бы мои ожидания оправдались, то работали бы и св-ва Align и constraints, да и вообще всё было бы "в шоколаде"...
  • Сергей М. © (28.10.08 20:03) [10]

    > у Panel2 должно было увеличиться ControlCount, а на практике
    > такого не случилось


    И не должно было.
    А с какого, спрашивается, перепугу оно должно было случиться ?
    Рассуждай вслух ..
  • tesseract © (28.10.08 21:37) [11]

    > но очень хотелось бы, чтоб всё работало без дополнительных
    > dll и ActiveX. Появилась в БД запись о новой программе -
    >


    епт типо exe уже чем-то круче? В обсчем сейчас ты знаимаешься ректальной реализацией  давно уже реализованного стандартными методами. Если хочешь иметь дело именно с VCL реализацией то нужно детально изучать структуру bpl и детали сношения с памятью VCL.


    > Года 3 назад разбирался с ActiveX и делал ActiveX Form,


    Я в возрасте полгода  в пелёнки писал. Вырос понял что это  неудобно. Ты в принципе не понимаешь как всё работает. ActiveX Form,  это то ещё недоразумение.
  • Германн © (29.10.08 01:26) [12]

    > tesseract ©   (28.10.08 16:36) [6]
    >
    > Ты сейчас занимаешься полной бессмыслицей, ты где нибудь
    > плагин в виде exe видел ?

    Я видел. Даже сам был однажды инициатором такого подхода. Но я никогда не болел тем, чтобы окно "внешнего" exe-шника встраивать в окно вызывающей программы.
    Не. Я бы тоже советовал бы СОМ, но они не потянули бы. :(

    P.S. Недавно один из них освоил основы ActiveX и теперь он хочет непременно получать для своей программы "драйверы устройств" по такой технологии.
  • boris3b (29.10.08 09:43) [13]

    > Я в возрасте полгода  в пелёнки писал. Вырос понял что это
    >  неудобно


    Не понял, а научили. Иж, какие мы высокопарные. Из всего тобой сказанного только первый пост в тему. Остальное - попытки тупо всё обосрать. На других форумах люди делали также как я и свои задачи решали. Все посты в уважительной форме и по делу.

     В общем - иди ты лесом...
  • Сергей М. © (29.10.08 09:49) [14]

    > Остальное - попытки тупо всё обосрать


    Надеяться на остро пока нет повода)

    Тебя заточка волнует или ты все же готов к диалогу, ведущему к осознанию где и в чем твоя ошибка ?

    Вопрос в [10] остался без ответа ..
  • tesseract © (29.10.08 10:09) [15]

    > Все посты в уважительной форме и по делу.



    > Остальное - попытки тупо всё обосрать.


    Тебе сказали по делу - COM. Не мучайся с остальным, "по делу" это как ? Дают куски когда с WASM.ru ? Ты имей в виду в Висте такое может не заработать.
  • boris3b (29.10.08 10:28) [16]
    > Надеяться на остро пока нет повода)
    >
    > Тебя заточка волнует или ты все же готов к диалогу, ведущему
    > к осознанию где и в чем твоя ошибка ?
    >


    Первое предложение не понятно из-за опечатки.
    К диалогу готов.

    Хотелось бы от Вас услышать, как бы сделали Вы? Если нужно еще какие-то детали описать - спрашивайте.

    В идеале это должно работать и в WinXP и в WinVista  и на FreeBSD под Wine.
  • Сергей М. © (29.10.08 10:36) [17]

    > boris3b   (29.10.08 10:28) [16]


    Нет, подожди ..
    Речт идет о логике или ее напрочь отсутствии.
    Вот ты заявил, что тебе "казалось".
    Я хочу проследить твою логику и предлагаю тебе вслух изложить основания для такого предположения..
  • boris3b (29.10.08 10:55) [18]

    > Вот ты заявил, что тебе "казалось".
    > Я хочу проследить твою логику и предлагаю тебе вслух изложить
    > основания для такого предположения..


    Вот чую, что это ещё одна попытка посмеяться над моими плясками с бубном.

    Казалось мне потому, что:
    1. Мои знания как взаимодействует VCL с API - никакие.
    2. Я использую родное свойство VCL-компонента - ParentWindow, а не API - SetParent. И если почитать Delphi Help на ParentWindow, то там есть следующее - "This allows references to the control by applications based on other applications."
  • Сергей М. © (29.10.08 11:26) [19]

    > ещё одна попытка посмеяться


    Что ж ты такой закомплексованный-то, а ?)


    > если почитать Delphi Help на ParentWindow, то там есть следующее


    Да, есть.

    Но где там хоть какое-либо упоминание о ControlCount ?

    И о каком ControlCount может идти речь, если родительским окном становится, к примеру, произвольное окно, не имеющее ни малейшего отношения к VCL ?

    В конце-концов, если есть сомнения в справ.информации, открываем генофонд и видим там истину:

    procedure TWinControl.SetParentWindow(Value: HWnd);
    begin
     if (FParent = nil) and (FParentWindow <> Value) then
     begin
       if (FHandle <> 0) and (FParentWindow <> 0) and (Value <> 0) then
       begin
         FParentWindow := Value;
         Windows.SetParent(FHandle, Value);
         if (Win32MajorVersion >= 5) and (Win32Platform = VER_PLATFORM_WIN32_NT) then
           Perform(WM_CHANGEUISTATE, MakeWParam(UIS_INITIALIZE, UISF_HIDEACCEL or UISF_HIDEFOCUS), 0);
       end else
       begin
         DestroyHandle;
         FParentWindow := Value;
       end;
       UpdateControlState;
     end;
    end;



    Где здесь хоть какой-либо намек на ControlCount ?
    Нет его.

    И в UpdateControlState тоже ничего подобного нет.

    Все что по сути делается - вызывается API-функция SetParent и следом перерисовываются все видимые окна, имеющие отношение к старому и новому родству окна переносимого к новому родителю контрола.


    > 1. Мои знания как взаимодействует VCL с API - никакие


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


    > использую родное свойство VCL-компонента - ParentWindow,
    >  а не API - SetParent


    Элементарные, как видишь, исследования показывают, что установка TWinControl.ParentWindow сводится к вызову Windows.SetParent.
 
Конференция "WinAPI" » Встраиваемые приложения [D7, WinXP]
Есть новые Нет новых   [134435   +33][b:0][p:0.001]