Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
28.12.2012, 21:03
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Тема как бы проскальзывала вскользь, но никогда нормально этого не делал. Например, есть proga1.exe, в ней есть есть Form1. Ну, 2-х экземпляров proga1.exe запущено быть не может. Код: vbnet 1. 2. 3.
Есть proga2.exe. Например, я хочу, чтобы, по нажатии кнопки в proga2.exe в proga1.exe выполнялось Form1.Label1.Caption=some_string где some_string -параметр передаваемый из proga2.exe Предполагается для начала, что единственный экземпляр proga1.exe уже запущен. Ну, далее, если proga1.exe не запущена, то должна запуститься и выполнить "команду". Что еще: 1) Давно я реализовывал это таймером в proga1.exe, кот. ожидает "файлы" со стороны proga2.exe 2) Потом "файлы" где-то заменил на чтение таблицы БД, где 1строчка=1команда, но принцип с таймером остался. Есть ли вариант механизма, чтоб это сделать "нормально"? Допустим, могу найти Form1.hwnd (ну, в шапке Form1 знаю же чего написано). Потом видимо должен слелать SendMessage(Form1.hwnd,... со стороны proga2.exe и сабклассить Form1? Как такое реализовать? Есть примеры? proga1.exe и proga2.exe -стандартные exe, никаких чудо-юдо-ActiveX не допускается. Объединить их в единственный exe не могу, хитро все там -долго объяснять. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.12.2012, 21:43
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.12.2012, 21:54
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Akina http://forum.sources.ru/index.php?showtopic=284371 Задание 1 Решение Lowimuz А пароль к rar какой? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.12.2012, 22:42
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Пароль Lowimuz: pzT*4hjG^Xw Хитро. Я вот еще чего нашел, но это по-другому: Handle custom window messages in your VB6 applications Есть над чем подумать, буду разбираться. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.12.2012, 02:31
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Akina, >Задание 1 >Решение Lowimuz При всем моем уважении к автору он немного жулик -чего не сделаешь ради призов. Я нарочно приложил его пример (как есть) -без пароля на архив. Жульничество в том, что в проекте в опциях компилятора стоит Compile to P-code вместо стандартного Compile to Native code и если поставить Native, то прога при запуске дает crash на строчке: Код: vbnet 1. 2. 3.
Причем сильно подозреваю что crash предначертан не этой строчкой, а вот этой: Код: vbnet 1. 2.
Код этот содран с майкрософтовского примера Использование именованных каналов в 32-разрядных программ Visual Basic Microsoft пример еще не пробовал пока. Думаю краша не будет, но будет висеть (т.к. там отсутствует CreateThread и нет отдельного потока). По логике моего "сервера" мне без этого потока никак. А с потоком будет крашить и непонятно лечится ли и как. Тема многопоточности здесь как-то обсуждалась, и насколько помнится все для меня уперлось именно в этот краш. Вот даже нашел первоисточник: Как вызвать функцию чтоб она не стопорила собой программу Дмитрий77Shocker.Pro, Конструкции такого вида Код: vbnet 1. 2. 3. 4.
Да и вообще любой вызов CreateThread валит приложение при запуске через exe а не в IDE, там надо либо как то извращаться, либо не связываться. Задача в частности нужна для реализации предыдущей моей темы. http://www.sql.ru/forum/actualthread.aspx?tid=809163 Т.е. логично из Load прочитать файл в интернете, но... страница может "открываться долго", это не должно тормозить/мешать старту программы. Поставить p-code у меня мозгов тогда не хватило. Но с другой стороны я не рискну ради этого компилировать приложение (ключевой exe программы) в p-code когда всю жизнь использую исключительно Native. Что делать пока не знаю. Желание продолжать разбирать код как-то ослабло, надо либо понять грабли с CreateThread либо наверно забить. Либо все-таки пытаться осознать вариант: Handle custom window messages in your VB6 applications ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.12.2012, 03:57
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Короче в баню эти глюко-калоканало-крашпотоки. Делается так: Inter process communication using registered messages from Visual Basic сервер (принимает) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
клиент(посылает) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
Ну а как структуры в lParam/wParam через Ptr пихать думаю разберусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.01.2013, 04:55
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Дима, программы могут общаться с помощью портов. Я использую UDP. Это удобно. Можно померить пуль (жива ли программа, не повисла...), организовать обмен информации что обеспечит управление. Такой прием пригодится даже если в будущем захочешь контролировать через интернет или по локалке. Есть к тебе вопрос. Ты в одном из постов работал с звуком. Нужно именно узнать общую громкость (у Виндовс) и если она не 100% - сделать ее 100% . Поможешь ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.01.2013, 06:48
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Андрей159Дима, программы могут общаться с помощью портов. Я использую UDP. Это удобно. Можно померить пуль (жива ли программа, не повисла...), организовать обмен информации что обеспечит управление. Такой прием пригодится даже если в будущем захочешь контролировать через интернет или по локалке.? UDP у меня честно ассоциируется с другим -SIP например по UDP работает. Хотя в том же Opal была когда-то утилита, кот. работала с библиотекой SpanDSP через UDP сокеты, сейчас сделали плагин кот. работает так сказать напрямую. Мне пока честно для обмена SendMessage хватит, и я очень рад что у меня наконец получилось, до этого использовал детское пуляние файлами. Единственное, с RegisterWindowMessage я погорячился, не удалось мне структурами через него пуляться. А вот WM_COPYDATA -самое то. Пуляется цифра (номер команды) cds.dwData и собственно строка команды (строка) cds.lpData As Long ' pointer to data to be passed to the receiving app. до кучи еще и ее длина cds.cbData As Long ' length in bytes of data pointed by lpData -хотя последнее для чтение самой строки не обязательно, ибо lpData это ptr на нее, а конец строки суть '\0', по байту ее по любому прочитаешь. В строку через точку с запятой запихивается вся нужная "структура с параметрами", потом тупо парсится на принимающей стороне. Короче тестовый пример во вложении чтоб не голословить. Андрей159Есть к тебе вопрос. Ты в одном из постов работал с звуком. Нужно именно узнать общую громкость (у Виндовс) и если она не 100% - сделать ее 100% . Поможешь ? Ну, вот этот пост: Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6? Там готовый законченный пример кот. отвечает на твои вопросы. Здесь последняя "версия" этого примера. Генерация телефонных тонов в динамики(наушники) компьютера. Что неясно? Там два модуля - один для XP, другой для Audio Core API (Виста и выше). Для XP я регулирую не "общую" громкость а "Звук" (Wave). Private Function OpenDevicePlayer(id As Long) As Boolean ... line.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT Чтоб вместо этого использовать "Общую", надо этот кусок чуть поменять, не _SRC_ а чего-то там _DST_ не помню. Я на общую забил потому как разработчик Opal что-то там возразил по поводу своих USB Handset -я ж этот код параллельно на C++ делал. Но помню что что-то очень простое. А по поводу висты и выше. Одназначно новые Core Audio APIs Потому что через старые ф-ции, во первых глючат, во вторых система не даст доступа к системным миксерам и создаст персональные для приложения, что не есть гуд. Но с Core Audio APIs у меня в модуле все есть (для того что вам нужно). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
18.01.2013, 22:34
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Спасибо за "Main Volume". Сейчас попробую вкратце и точно показать работу с портами. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
18.01.2013, 23:12
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Я тоже три года назад пулял файлами, но я работал с двумя разными движками: BlitzBasic & VB6. Понял как порты работают - быстренько все переделал... UDP протокол С ним все простенько. UDP порт не дает гарантию 100% доставки пакета. Через интернет работал. Некоторые пакеты при многочисленных посылках методом Send иногда просто пропадают. Зато с ним очень легко работать. Инициализация сокетов Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
В моем примере я использовал сокет WinsockOutPut чтоб вещать на том же комп'ютере в порт 53424 пульс программы. Другая программа компилированная слушала порт 53424 и если на протяжении 1 минуты не было сигнала, она принимала решения убрать программу с задач и запустить екзешник наново. Дальше, сокет WinsockOutPut2 использую как передатчик сообщений, а WinsockInput2 - приемник. RemoteNameComp - это константа или изменяемое пользователем айпи или имья PK или www...адресное значение. Радость в том что WinsockOutPut2.Connect RemoteNameComp, 53426 не будет материться о том что не существует адреса такого и типтого. А для прослушки указываем только порт который будем слушать и заявляем командой Bind. Все. Инициализировали сокет Посилка по UDP Код: vbnet 1. 2. 3. 4. 5.
Я на всякий случай проделал такой защитный механизм, хотя по UDP у меня ошибок такого рода не возникало. Можно и просто делать вот так: WinsockOutPut2.SendData S. Он шлет в независимости слушают его или нет. Ну и прием информации по UDP Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Также большой "+" UDP в том, что отправив к примеру 25 различных Send с одной программы, я получу 25 раз (или меньше) срабатывания события WinsockInput2_DataArrival с той же информацией. TCP - работает уже по другому - все посылки сумируются в единую строку и принимаются порциями, зато есть 100% гарантия доставки. Как один так и другой протокол не искривляют данные, просто UDP может их затерять а TCP не теряет С UDP хорошо работать на локалке или по локальной сети 1. пакеты практически не теряются 2. простота использования 3. сокет не капризничает Если все же нужно использовать через интернет, тогда в роутере нужно установить переадресацию с указанным портом на указанный айпи компьютера ... |
|||
:
Нравится:
Не нравится:
|
|||
|
18.01.2013, 23:43
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
TCP порт мне нравится лучше чем UDP, просто раньше я не умел им правильно пользоваться. Инициализация Код: vbnet 1. 2. 3. 4. 5.
Listen - слушает порт. Если кто-то пытается подключиться методом Connect (вот пример:Winsock2.Connect PidkluchennaIP, 58800), тогда срабатывает событие WSock_ConnectionRequest. Как будет видно дальше WSock.Accept RequestID разрешает соединение. Такое соединение работает под универсальным индексом RequestID. Таким образом можно к прмеру слушать порт 80 (так работают HTTP сервера). Обнаружив клиента, соединяться WSock.Accept RequestID, и в тот же час создавать новый сокет Load WSock(n) и назначать ему слушать порт 80. Таким образом работает многозадачность. Вернемся к сокету без масива. Я в коде больше не использую обработчик ошибок On Error а доверяю статусам WSock.State. Разобрав следующий код будет многое ясно. Я важное для себя распечатал на отдельной странице. А тут только небольшой работающий пример. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57.
Есть еще и WSock_SendProgress. С ним легко разобраться. Это типа датчик выгрузки. Можно получать % выгрузки с помощью этого события В чем прелесть TCP: 1. 100% доставка 2. клиент сразу видит есть соединение или нет. 3. если соединение есть, тогда в случае если что-то пойдет не так, сработает Close и на "клиенте" и на программе "серверная часть". В программе видно что при закрытие порта мы переходим в режим Listen. Событие закрытие порта работает на автомате, хоть на всякий случай есть WSock_Error собитие. Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
18.01.2013, 23:56
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Забыл в спешке приемущество TCP дописать. 4. Клиент-Сервер подключение через интернет Тут имеется ввиду, если ты сделал переадресацию на роутере (ожидая информацию на порт ххххх перенаправил на айпи компа который условно назвем "Сервер"), и при удачном коннекте сервер сможет не только принимать информацию а и отвечать. И в отличие от UDP на територии "клиента" не нужно никаких переадресаций на роутере делать. Пакеты будут удачно отправляться и возвращаться. Много было затяжных пауз (молчанок) на счет отправки и приема через интернет. Я спрашивал на форуме что нужно сделать чтоб дошла информация от ПК1 до ПК2. Теории было много, но конкретных ответов не увидел. Практика поставила все на свое место. Загвоздка заключалась в том что роутер получая адрес внешнего айпи не знал кому дальше эту информацию давать. С TCP протоколом, только для сервера (там где работает Listing) нужно указать в роутере переадресацию. И все заработает ... |
|||
:
Нравится:
Не нравится:
|
|||
|
19.01.2013, 00:26
|
|||
---|---|---|---|
|
|||
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Дмитрий77Короче в баню эти глюко-калоканало-крашпотоки. Делается так: Inter process communication using registered messages from Visual Basic {поскипано} Ну а как структуры в lParam/wParam через Ptr пихать думаю разберусь. Есть механизм "из коробки" - оконное сообщение WM_COPYDATA. Описание на MSDN - Using Data Copy (Windows) ЗЫ: возможно ошибаюсь , но если обмен сообщениями предполагается только между двумя процессами, то регистрация своего сообщения посредством RegisterWindowMessage - излишня. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
19.01.2013, 02:10
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
скукотищаЕсть механизм "из коробки" - оконное сообщение WM_COPYDATA. Описание на MSDN - Using Data Copy (Windows) ... регистрация своего сообщения посредством RegisterWindowMessage - излишня. Угу, есть. Я это понял практически как только так сразу. Руки правда дошли написать об этом только неделю назад, но ведь написал 13761693 . Дмитрий77Единственное, с RegisterWindowMessage я погорячился, не удалось мне структурами через него пуляться. А вот WM_COPYDATA -самое то. Пуляется цифра (номер команды) cds.dwData и собственно строка команды (строка) cds.lpData As Long ' pointer to data to be passed to the receiving app. до кучи еще и ее длина cds.cbData As Long ' length in bytes of data pointed by lpData -хотя последнее для чтение самой строки не обязательно, ибо lpData это ptr на нее, а конец строки суть '\0', по байту ее по любому прочитаешь. В строку через точку с запятой запихивается вся нужная "структура с параметрами", потом тупо парсится на принимающей стороне. Короче тестовый пример во вложении чтоб не голословить.. Причем готовые 2 проекта вложил. (не в обиду). Коробка коробкой, но с полностью грамотной передачей строки пришлось таки помучиться, хорошо есть уже готовые вымученные ф-ции работы с Ptr на строку. Без них VB путается с As String, Unicode/не_Unicode, len(str) и т.п. Обсуждали с Вами как то. А идея с RegisterWindowMessage понравилась т.к. подумал - а не передавать ли структуры {a as long(PtrToString), b as long} и т.п., но там все эти сложности сильно усложнились и оказались не по зубам - скорее решил съэкономить эти зубы. Парсинга единой строки вполне достаточно. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
19.01.2013, 02:27
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Андрей159 UDP протокол ... Андрей, спасибо. На заметку возьму. Но сейчас пока разбираться не буду, но если будет время и какие-либо идеи под это дело, то обязательно разберу ваши примеры. Теоретически интересными (и в общем актуальными если руки дойдут до модернизации моего старого приложения) является вопрос следующего порядка. Основное приложение (C++) Интерфейс-часть морда для пользователя (VB 6) В C++ нет объекта WSock.DoThis , да и в VB не очень то люблю использовать подобные контролы. SendMessage C++<>VB6 ? Но есть более интересный тяжелый случай: Приложение #1 работает "As Win Service" (т.е. под системной учеткой) Приложение #2 работает "Current User" Да пусть бы оба VB6. Вот как здесь быть? С UDP/TCP наверно прокатит... А с SendMessage?...Так понимаю сообщения пуляются только в рамках своей учетной записи, нет? (эт только пулятельные файлы общие - если конечно разрешений/запрещений не наставлено). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
19.01.2013, 10:39
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Дмитрий77, Я писал небольшой класс для работы с Shared Memory. Можете поискать. Обмен ещё проще чем через сокеты или пайпы. Механизм стандартный. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
19.01.2013, 15:49
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
VSVLADЯ писал небольшой класс для работы с Shared Memory. Можете поискать.С ходу не нашел. Ссылку б дали. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
19.01.2013, 16:29
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Дмитрий77, тоже что-то не нашёл, но помню выкладывал. Под себя можете переделать Пример: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
20.01.2013, 15:26
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
С++ целая библия лежит (купил 5 лет назад), но еще не начинал учить. Видел не мало примеров работы с сокетами через API. Сишка должна легко работать. Логика не меняется. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
20.01.2013, 21:26
|
|||
---|---|---|---|
Обмен сообщениями между двумя СВОИМИ приложениями |
|||
#18+
Андрей159С++ целая библия лежит (купил 5 лет назад), но еще не начинал учить. "Лежит" это метко подмечено. Я лет уже больше 10 назад такую "библию" проштудировал, но все равно не пошло. Умею только слегка править/дописывать коды и пользовать чужие C++ проекты (иногда HEX-вьюерами и редакторами ресурсов - не вдаваясь в коды). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=60&mobile=1&tid=2157207]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 166ms |
0 / 0 |