Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача параметров из одного приложения в другое 
:(
    Опции темы
Brain89
Дата 19.4.2011, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.1.2010

Репутация: 2
Всего: 2



У меня возникла проблема, которую в приближении можно описать так. Есть одно приложение со строкой ввода. По нажатию на кнопку строка передается во второе приложение (не форму! приложения независимы) и отображается в строке второго приложения. Если изменить надпись в первом приложении и снова нажать на кнопку, то надпись во втором приложении изменяется. Оба приложения запущены. Как подобное реализовать без использования сокетов (у меня маленькая локальная программа), без внешних файлов и реестра? Возможно ли это в условиях таких ограничений? Заранее спасибо.
PM   Вверх
likegift
Дата 19.4.2011, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 14.10.2008

Репутация: нет
Всего: 3



Pipes ?
PM MAIL   Вверх
Voyager
Дата 19.4.2011, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 3
Всего: 18



Можно. Гуглите в сторону pinvoke: WM_COPYDATA, как раз то что нужно.
Код

This message is sent when an application passes data to another application.

http://msdn.microsoft.com/en-us/library/ms649011(VS.85).aspx
http://www.codeproject.com/KB/cs/wm_copydata_use.aspx
http://www.codeproject.com/KB/threads/Inte...mmunicator.aspx
http://social.msdn.microsoft.com/Forums/en...9-f9f75717456c/


Это сообщение отредактировал(а) Voyager - 19.4.2011, 21:46
PM   Вверх
-Mikle-
Дата 20.4.2011, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Цитата(Voyager @  20.4.2011,  00:45 Найти цитируемый пост)
Гуглите в сторону pinvoke: WM_COPYDATA, как раз то что нужно

Думаю это слишком нативно для дотNET. Способов и без этого хватает. Лучше использовать те же пайпы как предложил likegift, или ремоутинг, ИМХО.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
neutrino
Дата 20.4.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 3
Всего: 62



Named Pipes
Shared memory
DDE



--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Brain89
Дата 20.4.2011, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.1.2010

Репутация: 2
Всего: 2



Спасибо всем за советы. В моем случае удобнее было бы использовать Pipe или посылку сообщения WM_COPYDATA (попробовал эти варианты, вполне работает), Remoting слишком масштабно, что ли. 
Но сейчас решил сделать следующим образом. Помимо написано выше, мне требуется, чтобы первая форма запускалась в единственном экземпляре. Потому я добавил такой класс:

Код

using Microsoft.VisualBasic.ApplicationServices;

public class OneInstanceApplication : WindowsFormsApplicationBase
{   
     private OneInstanceApplication()
     {   
           base.IsSingleInstance = true;   
     }   
  
     public static void Run(Form form, StartupNextInstanceEventHandler startupHandler)
     {   
           OneInstanceApplication oiaApp = new OneInstanceApplication();   
           oiaApp.MainForm = form;   
           oiaApp.StartupNextInstance += startupHandler;   
           oiaApp.Run(Environment.GetCommandLineArgs());   
     }
} 


И вызываю форму так:

Код

OneInstanceApplication.Run(new Form1(), StartupNextInstanceHandler);


В самом же обработчике запуска второго экземпляра получаю параметры командной строки, переданные из второго приложения и содержащие нужную строку, и работаю с ними:

Код

static void StartupNextInstanceHandler(object sender, StartupNextInstanceEventArgs e)
{
     if(e.CommandLine.Count > 1)
          ((Form1)((OneInstanceApplication)sender).OpenForms[0]).SetNewText(e.CommandLine[1]); // SetNewText - изменяет текст в строке ввода
} 


Как вам такой вариант? Я подозреваю, что у него есть какие-то изъяны, но пока не знаю, какие)
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.