Автор | Сообщение |
|
| |
Пост N: 156
Зарегистрирован: 05.11.05
|
|
Отправлено: 08.04.19 11:55. Заголовок: ActiveX
Начал новую тему, т.к. подозреваю, что вопрос мой не Харбора касается. В папке \samples\Advanced\ActiveX лежит демо, этакий браузер, работающий через ActiveX. Всё с ним хорошо, кроме одного: если я беру и его функцию MAIN делаю CHILD, после чего вешаю это на кнопку другой процедуры, то вызывается это окно только один раз. Стоит его закрыть и вызвать снова, окно открывается, после чего происходит какая-то виндовая проблема и всё это валится. Кто-нибудь понимает почему и как это исправить?
|
|
|
Ответов - 21
, стр:
1
2
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 2321
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.04.19 08:40. Заголовок: На MODAL аналогично ..
На MODAL аналогично поведение. Запуск нескольких экземпляров с правкой ON INIT TestNavigate() ; ON RELEASE Win1.Test.Release /* DEFINE MAIN MENU POPUP "Test" MENUITEM "Navigate" ACTION TestNavigate() END POPUP END MENU */ работают
|
|
|
|
| |
Пост N: 157
Зарегистрирован: 05.11.05
|
|
Отправлено: 09.04.19 10:35. Заголовок: Долго пытался понять..
Долго пытался понять, так как у меня такого нет. Потом предположил, что вы смотрели пример в SAMPLES\BASIC\ActiveX\ А в \samples\Advanced\ActiveX как-то не так...
|
|
|
|
| постоянный участник
|
Пост N: 2323
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.04.19 11:27. Заголовок: rvu пишет А в \s..
rvu пишет цитата: | А в \samples\Advanced\ActiveX как-то не так... |
| Запуск нескольких экземпляров demo.exe работают. Вам надо иметь параметром home адрес, к примеру так 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() ; ...
|
|
|
|
| |
Пост N: 158
Зарегистрирован: 05.11.05
|
|
Отправлено: 09.04.19 13:37. Заголовок: Ничего не получается..
Ничего не получается у меня. Да и было прописано у меня это, хотя немного и не так. А можете отправить мне свой рабочий пример полностью? Я в личку написал свою почту.
|
|
|
|
| |
Пост N: 159
Зарегистрирован: 05.11.05
|
|
Отправлено: 09.04.19 13:45. Заголовок: А может мы опять о р..
А может мы опять о разном? У меня проблема, что когда я делаю эту функцию не Main и вызываю её из другой, то окно открывается. Но после закрытия этого окна, второй раз вызвать его из моей процедуры Main не удается.
|
|
|
|
| постоянный участник
|
Пост N: 2324
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.04.19 14:45. Заголовок: rvu пишет Но после з..
rvu пишет цитата: | Но после закрытия этого окна, второй раз вызвать его из моей процедуры Main не удается. |
| Говорим об одном и том же. Валится ACCES VIOLATION ... любимое сняти в VO при обращении к памяти, которую обработал мусоросборщик, а ссылки остались. Решение, на сейчас, оформление проги ActiveX в утилиту или запуск той же проги с параметрами, только для запуска ветки с ActiveX. Почтой не пользуюсь. Пример тут https://TransFiles.ru/d974x Запускаем Main.exe и дальше кнопки
|
|
|
|
| |
Пост N: 160
Зарегистрирован: 05.11.05
|
|
Отправлено: 09.04.19 15:13. Заголовок: Понятно. Вы вызывает..
Понятно. Вы вызываете его отдельным .exe файлом. Так я тоже делал. Но, во-первых, тоже были некоторые проблемы, во-вторых, хотелось всё держать в одном файле. Тут и возникала глобальная проблема, когда я всё в один файл пытался запихнуть. Я и писал об этом: "беру и его функцию MAIN делаю CHILD..." А из проблем вызова отдельным .exe файлом: можно закрывать все эти окна вместе с вызывающим окном? Хотелось бы - закрыл главное окно и всё закрылось. Еще один вопрос был, но ответ увидел в вашем примере, большое спасибо, что выложили!
|
|
|
|
| постоянный участник
|
Пост N: 2325
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.04.19 15:26. Заголовок: rvu пишет хотелось ..
rvu пишет цитата: | хотелось всё держать в одном файле |
| Так и держите, имейте параметры запуска My.exe -ie "adres" FUNC Main( p1, p2, ... ) If empty(p1) ElseIf p1 $ '-ie /ie" Addr := p2 // ActiveX тут ... цитата: | Хотелось бы - закрыл главное окно и всё закрылось |
| В куске ActiveX (Demo.prg) ставите TIMER, к примеру, для ловли файла завершения Как поймали убираете окно работы через Release
|
|
|
|
| постоянный участник
|
Пост N: 2326
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.04.19 15:28. Заголовок: PS Главная прога, со..
PS Главная прога, создает файл завершения, когда его закрывают, для окна работы ActiveX
|
|
|
|
| постоянный участник
|
Пост N: 6233
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.04.19 15:48. Заголовок: rvu пишет: Хотелось..
rvu пишет: цитата: | Хотелось бы - закрыл главное окно и всё закрылось. |
| Смотреть пример C:\MiniGUI\SAMPLES\Advanced\RunTasks 1) Можно запросить хендл открытых окон. 2) Закрываем весь этот список. Примерно так: // закрыть по ХЕНДЛУ открытые задачи на хХарборе/МиниГуи IF LEN(aDim) > 0 FOR nI := 1 TO Len( aDim ) hWndTask := aDim[nI] PostMessage( hWndTask, WM_CLOSE, 0, 0) DO EVENTS NEXT ENDIF Смотреть примеры C:\MiniGUI\SAMPLES\Advanced\ExternalApp_3\demo2.prg
|
|
|
|
| |
Пост N: 161
Зарегистрирован: 05.11.05
|
|
Отправлено: 09.04.19 15:51. Заголовок: SergKis пишет: для ..
SergKis пишет: цитата: | для ловли файла завершения |
| Я писал, что тоже пошел по пути разделения файлов и передавал между ними информацию, записывая ее на диск. А вчера мне сказали сделать с ней CD-диск. На него я, естественно, ничего записать при работе не могу. Информацию при вызове браузера могу ему передать в параметрах. А вот закрытие... Разве что писать в %TEMP% компьютера? Кстати, как в Харборе ее посмотреть?
|
|
|
|
|
| постоянный участник
|
Пост N: 6234
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.04.19 15:59. Заголовок: Кстати, как в Харбор..
|
|
|
|
| постоянный участник
|
Пост N: 2327
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.04.19 16:05. Заголовок: rvu Можно сделать к..
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() ...
|
|
|
|
| |
Пост N: 162
Зарегистрирован: 05.11.05
|
|
Отправлено: 09.04.19 19:29. Заголовок: А параметр передаетс..
А параметр передается только один? EXECUTE FILE cRun PARAMETERS cAddr Какое ограничение по длине текста?
|
|
|
|
| постоянный участник
|
Пост N: 2328
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.04.19 21:02. Заголовок: rvu пишет Какое огра..
rvu пишет цитата: | Какое ограничение по длине текста? |
| Это ф-я ShellExecute, т.е. ограничения, наверно, как на строку. Сделайте так, к примеру, 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 ....
|
|
|
|
| постоянный участник
|
Пост N: 2329
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.04.19 21:04. Заголовок: PS надо If n ..
PS надо If n > 0 Addr := a[ 1 ] EndIf
|
|
|
|
| |
Пост N: 163
Зарегистрирован: 05.11.05
|
|
Отправлено: 09.04.19 21:11. Заголовок: Это я уже сделал, сп..
Это я уже сделал, спасибо!
|
|
|
|
| |
Пост N: 164
Зарегистрирован: 05.11.05
|
|
Отправлено: 10.04.19 15:02. Заголовок: Andrey пишет: Смотр..
Andrey пишет: цитата: | Смотреть примеры C:\MiniGUI\SAMPLES\Advanced\ExternalApp_3\demo2.prg |
| Очень понравилось! То что нужно!
|
|
|
|
| |
Пост N: 361
Зарегистрирован: 05.11.05
|
|
Отправлено: 12.08.21 14:15. Заголовок: 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" ) В браузере он открывается, но печатается не он, а который был до него. Вот в следующий раз напечатается нужный, открытый. В исходном образце все работает нормально. Я долго пытался понять, что нужно еще вписывать, но так и не понял.
|
|
|
|
| |
Пост N: 223
Зарегистрирован: 17.10.05
|
|
Отправлено: 13.04.22 13:02. Заголовок: SergKis пишет: Гово..
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; } } то все начинает работать!
|
|
|
|
| moderator
|
Пост N: 2032
Зарегистрирован: 11.02.10
|
|
Отправлено: 13.04.22 14:58. Заголовок: krutoff пишет: Если..
krutoff пишет: цитата: | Если в классе TActiveX немного изменить функцию ATLAXWINEND |
| Поправил эту функцию для следующего обновления Благодарю за помощь
|
|
|
Ответов - 21
, стр:
1
2
All
[только новые]
|
|