Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > .NET для новичков > Обмен данными между приложениями. |
Автор: NightmareZ 10.10.2009, 16:40 |
Как можно передать строку из одного приложения в другое? |
Автор: Ram1reS 10.10.2009, 17:28 |
Файлом, БД, .net remoting, wcf, web-service, msmq, тупо сокеты, etc. ... |
Автор: Medved 10.10.2009, 17:42 | ||
Да как угодно. Начиная от простейшего метода, через общий файл (текстовой или какой либо другой) и заканчивая специализированными технологиями для интеграции приложений. Можешь БД использовать, можешь веб-сервис, можешь локальный сервис на компьютере, или COM взаимодействие. Все зависит от контекста и конкретной задачи.
Вот хорошая презентация на эту тему: https://msdb.ru/Downloads/Docs/Events/Materials/281102/NET02.ppt |
Автор: Medved 10.10.2009, 20:31 | ||
http://msdn.microsoft.com/ru-ru/library/system.messaging.messagequeue.aspx#Mtps_DropDownFilterText |
Автор: NightmareZ 10.10.2009, 23:17 |
А проще варинт есть? З.Ы. Сокеты в этом деле плохи тем, что, например, какое-либо другое приложение может использовать тот же порт. |
Автор: Crypton 11.10.2009, 01:31 |
Может лучше Mutex? |
Автор: NightmareZ 11.10.2009, 01:33 |
А что с ним? |
Автор: Medved 11.10.2009, 02:16 |
С помощью http://ru.wikipedia.org/wiki/%D0%9C%D1%8C%D1%8E%D1%82%D0%B5%D0%BA%D1%81 можно запретить повторный запуск приложения. http://sql.ru/forum/actualthread.aspx?bid=34&tid=396806&hl=%e7%e0%ef%f0%e5%f2%e8%f2%fc+%e7%e0%ef%f3%f1%ea в интернете много решающих эти задачи. Но это не решает вопроса о передачи строки из одного приложения, в другое. Используй реестр или временный файл. Это конечно не кошерно, но практично. А вообще для меня такого рода прблемы служат индикаторм того, что программист начинает гордить куйню. Горе от ума вообщем. |
Автор: NightmareZ 11.10.2009, 02:50 | ||||
А.... м....... ну я вроде не спрашивал, как запретить повторный запуск.......
Если два приложения одновременно будут писать в файл/реестр? Как передать первому экземпляру приложения информацию о том, что нужно прочитать этот файл/ветку реестра, ибо информация в нём/ней обновилась?
Ну так просвяти, как избавиться от этой проблемы? Как бы поступил ты? |
Автор: Medved 11.10.2009, 04:40 | ||
Зачем тебе запрещать запуск двух копий приложения, и если уж запрещать (что не сложно реализовать черезь мьютексы, которые как раз для таких ситуаций и придуманы), то обязательно передавать параметры командной строки от одного приложения - к другому? Вот это мне сложно понять. Откуда вообще взялось такое требование, и чем оно продиктовано? Какие обстоятельства привели тебя к тому, что ты стал решать эту проблему (передавать командную строку)? |
Автор: Medved 11.10.2009, 05:03 |
Просто понимаешь, программирование существует уже относительно давно, и многие задачи уже решали до тебя другие уже 1000 раз. Если ты изобретаешь новый язык программирования, то оно понятно, там еще нужно поломать голову, как сделать что-то, что до тебя еще никто не делал. Но все остальные вопросы уже давно обдуманы умными бородатыми дядьками, и готовые варианты реализованы в виде конкретных решений, называемых средой разработки (на уровне языков, платформ, паттернов и т.д.). Вопросы как сделать то, или другое обычно исходят от неумения или лени читать документацию, которая поставляется с платформой, на которой реализуется решение. И особенно это относятся к тем случаям, которые касаются инфраструктурного кода (в отличии от прикладного уровня, непосредственно реализующего бизнес-процессы и задачи конечного пользователя) Зачастую, задачи, которые реаются простым и изящным способом, неопытные программисты начинают решать "через америку". В смысле, что тебе надо добраться до соседнего дома в Рязани, но ты для этого фрахтуешь частный самолет, летишь через Германию, там пересаживаешься на Боинг, перелетаешь через Атлантику в Нью-Йорк, а от туда на параходе в порт Находка, потом на собачьих упряжках до Новосиба, а от туда уже на поезде до Рязани, потом на такси до нужного дома. Хотя всего-то надо было пройти 10 метров пешком. И это довольно распространенная ситуация в отечественном программировании. Отчасти это объясняется особенностями преподавания и обучения программированию на территории бывшего СНГ, когда вместо того, что обучать программированию, учат кодингу. И книги соответственно по кодированию вместо того чтобы называть их "руководство по кодингу", называют "руководство по программированию". А кодинг и программирование - это разные понятия. Так как программирование включает в себя линейку - проектирование-кодирование-тестирование. Мне вот опыт подсказывает что в данном случае возможна именна такая ситуация. |
Автор: Rohoss 11.10.2009, 11:53 | ||
Я бы использовал http://msdn.microsoft.com/ru-ru/library/system.runtime.remoting.channels.ipc.aspx Добавлено через 6 минут и 6 секунд
Medved, ИМХО, требования вполне адекватные… Мне кажется, подобным образом работают, например видеопроигрыватели, например тот же LightAlloy |
Автор: Medved 11.10.2009, 14:05 | ||
С таким же успехом можно убить певрое (ненужное приложение) и запустить вторую копию, в которую и передаются все данные. Угу, микроскопом гвозди забивать - вот как это называется. |
Автор: NightmareZ 11.10.2009, 14:11 | ||||||
Обгадили с ног до головы. Косолапый считает, что я "неопытный программист", "неумеющий и ленящийся читать документацию", "начитавшийся книг по кодингу". Вот чесно, в реальной жизни я бы предпочёл за такой подход дать по морде, но так как на форумах это не принято и физически нереализуемо, то попрошу лишь не разводить свою философию в моих темах. Ок, спасибо, попробую.
А ещё так работают, например, Paint.NET, Photoshop....
Пойди погуляй. Меня не интересует твои измышлизмы по сабжу. Я задал конкретный вопрос и хочу лишь ответа на него. |
Автор: Medved 11.10.2009, 14:21 | ||||||
NightmareZ, прости, не заметил у тебя надписи [хакер], теперь все понятно.
Твоя реакция говорит мне о том, что так и есть. Еще сомневался, теперь уж точно уверен. А как тебя еще называть? Я тебе помог, а ты вместо благодарности еще и минус залепил.
Писюн еще не вырос.
Что же ты до конца эту проблему не решил? Столкнулся со сложностью, и тут же решил сдаться? Что до конца не добил? Опытный программист предпочитает разбираться до конца, а не бежать в кусты, при первой возникшей перед ним сложности. Ммм..да. Вот и помогай после этого. Был бы поумнее, может быть и уму разуму бы научился, а так продолжай и дальше быдлокодить ![]() |
Автор: NightmareZ 11.10.2009, 14:22 |
Medved, уйди пожалуйста из темы. |
Автор: Medved 11.10.2009, 14:29 | ||||
Испугался?
Посмотри первые два сообщения, в том числе и мое, там были конкретные ответы... Однако ты столкнулся со сложностью, и решил сигануть в кусты. Ты не ответил на мой вопрос:
Видимо действительно нагородил... |
Автор: Rohoss 11.10.2009, 14:45 | ||
Зачем лишний раз загружать приложение? А если оно долго грузится… кому это надо? |
Автор: Skynin 11.10.2009, 18:38 | ||||
... а еще можно следить за буфером обмена, как то массово делают перехватыватели ссылок из браузера. Например EMule. Правда, тогда информация которая там есть потеряется, а нужно бы чтобы осталась, ведь пользователь не были инициатором записи чего-то в буфер обмена. http://msdn.microsoft.com/en-us/library/system.windows.clipboard.aspx http://www.codeproject.com/KB/shell/clipboard02.aspx В любом случае логика рассуждений: Первая копия приложения должна ждать присылаемое: 1. Что-то постоянно опрашивать (файл, "флаг", ...) - по моему расточительно и неумно для данной задачи. 2. Слушать, авось что пришлют. По TCP/UDP, IPC, ..., Clipboard, ..., .... Если приложение оконное - получить дескриптор окна первой копии и всунуть событие в очередь его событий. Для того чтобы определиться с выбором из списка 2 - условий указано маловато. Поэтому ответ и получается - да делай шо хошь, кто ж тебя поймет, что тебе нужно то. Потому что "Затем вторая. Вторая обнаруживает" - а если в это время запускается третья, как ей счирикиваться с двумя предыдущими? Или разрешено так - увидела что две уже копии - тогда все, просто молча и выключилась?
Вот это то как раз рутинно решаемая проблема - при старте первой копии - ищется свободный порт(из диапазона, или начиная с попытки повеситься на порт по умолчанию) и записывается в такое место, из которого могут прочесть последующие копии программы.
Понятия не имею об задаче в целом. Может и задумался над вопросом "Какие обстоятельства привели меня к тому, что я стал решать эту проблему (передавать командную строку)?" |
Автор: NightmareZ 12.10.2009, 04:28 | ||
Есть программа. Есть тип файлов, ассоциированный с этой программой. Пользователь даблкликает на файле - происходит запуск первого экзепляра программы, которому передаётся имя файла, по которому кликал юзверь, в командной строке. Если юзверь так же захочет открыть другой подобный файл, не закрывая программу, что получится? - Будет запущен второй экземпляр программы, которому будет передано имя файла. Мне нужно закрыть второй экземпляр, а первому передать инфу о том, что нужно открыть новый файл.... чтобы в первом экземпляре было загружено уже два файла. |
Автор: Veitmen 12.10.2009, 05:07 | ||
Приветствую. Я так понял это для вашего приложения - редактора? ![]()
Используйте маршалинг или тупо SendMessage. Использовать Remoting, MSMQ, WCF or WebServices в данном случае бессмысленно, это и правда забивать микроскопом гвозди. Копипаст с другого форума: 1. Посылка сообщений. Один процесс вызывает SendMessage или PostMessage, другой процесс GetMessage. Все очень просто, передается 3 слова: сообщение, lparam и wparam. 2. Посылка прерываний (сигналов, если следовать терминологии *nix). Один процесс вызывает какую-то функцию системы, передает ей PID и номер сигнала. Система прерывает выполнение программы-получателя и переходит к выполнению какой-то части программы, называемой обработчиком прерывания. Как только обработчик закончит выполнение — программы продолжает работать с той точки где была прервана. 3. Каналы ввода-вывода. Все очень просто. Один процесс пишет в канал, другой читает. Можно передавать сколь угодно данных, на любой скорости. Проблема только в том, как соорудить этот канал данных. Можно при запуске переопределить STDIN и STDOUT или передать дескриптор канала по наследству, это если один процесс запускает другой. Можно использовать именованные каналы (если позволяет система). Можно использовать сокеты. 4. Файлы отображаемые в память. Ни разу не пользовался. Но, как я понимаю некоторая часть памяти ставится в соответствие файлу чтение этой памяти приводит к чтению из файла, запись в память — к записи в файл. 5. Маршалинг (передача буфера через границы процессов средствами системы) Идея простая, но описание грубое. Берем буфер (в памяти одного процесса) и передаем его системе. В другом процессе выделяем в виртуальной памяти место для буфера и запрашиваем у системы этот самый буфер. Система копирует данные из одного процесса в другой. |
Автор: NightmareZ 12.10.2009, 05:42 |
Взаимно ![]() Да ![]() Маршалинг? А как его тут можно использовать? А SendMessage не особо удобно. Сейчас сделал через временные файлы. Первый экземпляр мониторит директорию, находащуюся в LocalApplicationData, а остальные пишут туда инфо о тех файлах, которые нужно загрузить. |
Автор: Veitmen 12.10.2009, 06:48 | ||
Да и правда, маршалинг вам тут не поможет. Хотя поизвращаться можно. ![]() Безусловно, но если вы не хотели бы использовать файл то можно так.
Нормальное решение. Так и нужно, и не надо тут что нить городить. Удачи вам с вашим редактором. Слежу с интересом, надеюсь на фриварную версию. ![]() |
Автор: NightmareZ 12.10.2009, 19:16 |
Спасибо ![]() |
Автор: nyxiscoo1 15.10.2009, 01:02 |
Есить готовое решение для VB .Net, но его можно использовать и в C# http://www.codeproject.com/KB/cs/CSSIApp.aspx |