Форум » GUI » ActiveX » Ответить

ActiveX

rvu: Начал новую тему, т.к. подозреваю, что вопрос мой не Харбора касается. В папке \samples\Advanced\ActiveX лежит демо, этакий браузер, работающий через ActiveX. Всё с ним хорошо, кроме одного: если я беру и его функцию MAIN делаю CHILD, после чего вешаю это на кнопку другой процедуры, то вызывается это окно только один раз. Стоит его закрыть и вызвать снова, окно открывается, после чего происходит какая-то виндовая проблема и всё это валится. Кто-нибудь понимает почему и как это исправить?

Ответов - 21, стр: 1 2 All

SergKis: На MODAL аналогично поведение. Запуск нескольких экземпляров с правкой[pre2] ON INIT TestNavigate() ; ON RELEASE Win1.Test.Release /* DEFINE MAIN MENU POPUP "Test" MENUITEM "Navigate" ACTION TestNavigate() END POPUP END MENU */ [/pre2] работают

rvu: Долго пытался понять, так как у меня такого нет. Потом предположил, что вы смотрели пример в SAMPLES\BASIC\ActiveX\ А в \samples\Advanced\ActiveX как-то не так...

SergKis: rvu пишет А в \samples\Advanced\ActiveX как-то не так... Запуск нескольких экземпляров demo.exe работают. Вам надо иметь параметром home адрес, к примеру так[pre2] STATIC PROCEDURE fOpenActivex( cAddr ) ... DEFAULT cAddr := "www.google.com" ... oActiveX:Silent := 1 oActiveX:Navigate( cAddr ) RETURN ... FUNCTION Main( Addr ) ... ON INIT fOpenActivex(Addr) ; ON RELEASE fCloseActivex() ; ... [/pre2]


rvu: Ничего не получается у меня. Да и было прописано у меня это, хотя немного и не так. А можете отправить мне свой рабочий пример полностью? Я в личку написал свою почту.

rvu: А может мы опять о разном? У меня проблема, что когда я делаю эту функцию не Main и вызываю её из другой, то окно открывается. Но после закрытия этого окна, второй раз вызвать его из моей процедуры Main не удается.

SergKis: rvu пишет Но после закрытия этого окна, второй раз вызвать его из моей процедуры Main не удается. Говорим об одном и том же. Валится ACCES VIOLATION ... любимое сняти в VO при обращении к памяти, которую обработал мусоросборщик, а ссылки остались. Решение, на сейчас, оформление проги ActiveX в утилиту или запуск той же проги с параметрами, только для запуска ветки с ActiveX. Почтой не пользуюсь. Пример тут https://TransFiles.ru/d974x Запускаем Main.exe и дальше кнопки

rvu: Понятно. Вы вызываете его отдельным .exe файлом. Так я тоже делал. Но, во-первых, тоже были некоторые проблемы, во-вторых, хотелось всё держать в одном файле. Тут и возникала глобальная проблема, когда я всё в один файл пытался запихнуть. Я и писал об этом: "беру и его функцию MAIN делаю CHILD..." А из проблем вызова отдельным .exe файлом: можно закрывать все эти окна вместе с вызывающим окном? Хотелось бы - закрыл главное окно и всё закрылось. Еще один вопрос был, но ответ увидел в вашем примере, большое спасибо, что выложили!

SergKis: rvu пишет хотелось всё держать в одном файле Так и держите, имейте параметры запуска My.exe -ie "adres" FUNC Main( p1, p2, ... ) If empty(p1) ElseIf p1 $ '-ie /ie" Addr := p2 // ActiveX тут ... Хотелось бы - закрыл главное окно и всё закрылось В куске ActiveX (Demo.prg) ставите TIMER, к примеру, для ловли файла завершения Как поймали убираете окно работы через Release

SergKis: PS Главная прога, создает файл завершения, когда его закрывают, для окна работы ActiveX

Andrey: rvu пишет: Хотелось бы - закрыл главное окно и всё закрылось. Смотреть пример C:\MiniGUI\SAMPLES\Advanced\RunTasks 1) Можно запросить хендл открытых окон. 2) Закрываем весь этот список. Примерно так: [pre2] // закрыть по ХЕНДЛУ открытые задачи на хХарборе/МиниГуи IF LEN(aDim) > 0 FOR nI := 1 TO Len( aDim ) hWndTask := aDim[nI] PostMessage( hWndTask, WM_CLOSE, 0, 0) DO EVENTS NEXT ENDIF[/pre2] Смотреть примеры C:\MiniGUI\SAMPLES\Advanced\ExternalApp_3\demo2.prg

rvu: SergKis пишет: для ловли файла завершения Я писал, что тоже пошел по пути разделения файлов и передавал между ними информацию, записывая ее на диск. А вчера мне сказали сделать с ней CD-диск. На него я, естественно, ничего записать при работе не могу. Информацию при вызове браузера могу ему передать в параметрах. А вот закрытие... Разве что писать в %TEMP% компьютера? Кстати, как в Харборе ее посмотреть?

Andrey: Кстати, как в Харборе ее посмотреть? Смотри пример - https://cloud.mail.ru/public/4JFZ/35VkjhxvD

SergKis: rvu Можно сделать как Андрей показал. Еще есть пример исп. сообщения WM_COPYDATA (можно передавать команды\данные с ее помощю), т.е. осн. программа при закрытии посылает это сообщение окну ActiveX, которое, поймав его, выполняет Release (BASIC\IPC\...) как в Харборе ее посмотреть? i_app.ch ... #translate System.DesktopFolder => GetDesktopFolder() #translate System.MyDocumentsFolder => GetMyDocumentsFolder() #translate System.ProgramFilesFolder => GetProgramFilesFolder() #translate System.SystemFolder => GetSystemFolder() #translate System.TempFolder => GetTempFolder() #translate System.UserTempFolder => GetUserTempFolder() #translate System.WindowsFolder => GetWindowsFolder() ...

rvu: А параметр передается только один? EXECUTE FILE cRun PARAMETERS cAddr Какое ограничение по длине текста?

SergKis: rvu пишет Какое ограничение по длине текста? Это ф-я ShellExecute, т.е. ограничения, наверно, как на строку. Сделайте так, к примеру,[pre2] Main.prg *----------------------------------------------------------------------------* FUNC RunIE() *----------------------------------------------------------------------------* LOCAL cAddr := '"'+This.Cargo+'"' LOCAL cRun := '.\Demo.exe' cAddr := This.Cargo+';'+'www.google.com'+';'+'http://hmgextended.com' If ! empty(cAddr) EXECUTE FILE cRun PARAMETERS cAddr EndIf RETURN Nil Demo.prg FUNCTION Main( Addr ) LOCAL a _logfile(.T., Addr) If ! empty(Addr) a := hb_ATokens(Addr, ';') Addr := a[1] EndIf _logfile(.T., Addr, a) ... Если вместо ; использовать " ", то на входе будет много параметров, т.е. FUNCTION Main( ... ) LOCAL a := hb_AParams() LOCAL n := Len( a ) LOCAL Addr If n > 0 Addr := a[ n ] EndIf .... [/pre2]

SergKis: PS[pre2] надо If n > 0 Addr := a[ 1 ] EndIf [/pre2]

rvu: Это я уже сделал, спасибо!

rvu: Andrey пишет: Смотреть примеры C:\MiniGUI\SAMPLES\Advanced\ExternalApp_3\demo2.prg Очень понравилось! То что нужно!

rvu: rvu пишет: В папке \samples\Advanced\ActiveX лежит демо, этакий браузер, работающий через ActiveX. Опять я о нем. На основе него есть программа, где такая печать: IF ValType( oWActiveX ) <> "U" IF lPreview oActiveX:ExecWB( OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT ) ELSE oActiveX:ExecWB( OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT ) ENDIF ENDIF Хочу заменить url и напечатать. Меняю: oActiveX:Navigate( "proba.html" ) В браузере он открывается, но печатается не он, а который был до него. Вот в следующий раз напечатается нужный, открытый. В исходном образце все работает нормально. Я долго пытался понять, что нужно еще вписывать, но так и не понял.

krutoff: SergKis пишет: Говорим об одном и том же. Валится ACCES VIOLATION ... Похоже на то, что нашел решение: Если ActiveX формируется не в Main окне, то в методе Load() CLASS TActiveX со второго вызова не создается окно ::hWnd := CreateWindowEx( nHandle, ::cProgId ) (CreateWindowEx с ошибкой 1407, т.к. до этого не отрабатывает _Ax_Init ). Если в классе TActiveX немного изменить функцию ATLAXWINEND на такой вид: HB_FUNC( ATLAXWINEND ) { if( hAtl ) { FreeLibrary( hAtl ); hAtl = NULL; } } то все начинает работать!



полная версия страницы