Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Передача параметров из одного приложения в другое


Автор: Brain89 19.4.2011, 17:33
У меня возникла проблема, которую в приближении можно описать так. Есть одно приложение со строкой ввода. По нажатию на кнопку строка передается во второе приложение (не форму! приложения независимы) и отображается в строке второго приложения. Если изменить надпись в первом приложении и снова нажать на кнопку, то надпись во втором приложении изменяется. Оба приложения запущены. Как подобное реализовать без использования сокетов (у меня маленькая локальная программа), без внешних файлов и реестра? Возможно ли это в условиях таких ограничений? Заранее спасибо.

Автор: likegift 19.4.2011, 18:13
Pipes ?

Автор: Voyager 19.4.2011, 21:45
Можно. Гуглите в сторону 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/InterprocessCommunicator.aspx
http://social.msdn.microsoft.com/Forums/en-US/vbinterop/thread/62d0c25f-dadb-4b24-9679-f9f75717456c/

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

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

Автор: neutrino 20.4.2011, 14:02
Named Pipes
Shared memory
DDE

Автор: Brain89 20.4.2011, 16:29
Спасибо всем за советы. В моем случае удобнее было бы использовать 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 - изменяет текст в строке ввода
} 


Как вам такой вариант? Я подозреваю, что у него есть какие-то изъяны, но пока не знаю, какие)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)