Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Связать приложения через Windows-сообщения Добавлено: 06.02.09 09:08  

Автор вопроса:  Oleg | ICQ: 407182478 
Доброго дня. Подскажите плиз, как в VB объявить/зарегестрировать новое событие для приложения и процедуру обработки этого события, для того, что бы из другого приложения можно было посылать сообщения, например через API SendMessage?

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 06.02.09 17:19
Вообще в .NET должны быть более цивилизованые методы межпроцесового взаимодействия.

Ответить

Номер ответа: 2
Автор ответа:
 Oleg



ICQ: 407182478 

Вопросов: 9
Ответов: 10
 Профиль | | #2 Добавлено: 06.02.09 18:14
Ок. Давайте конктретно. Мне необходимо из моего приложения считывать и записывать данные из ячеек Excel(причём в большом количестве).
Используя технологию VSTO(кажется так), пробовал 10000 раз считать значение одной ячейки - становится грустно, результата не дождался,
а если то же самое провернуть под Excel т.е. на VBA, время исполнения кода примерно 0,5 сек. Вот и задался я вопросом о другом
методе межпроцесового взаимодействия
и Windows-сообщения - первое(и по ходу последнее) что пришло в голову. Что скажите?

Ответить

Номер ответа: 3
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #3 Добавлено: 06.02.09 19:45
Щас непомню че за ерунда, но аббревиатура знакомая.
Чтоб читать данные из экселя нафиг не нужны никакие сверх технологии :)
Подключаешь модель экселя и рулишь ей как хочется, на VB6 элементарно.
А в .Net как всегда нужно закопаться куданибудь типа гейтс.билл.микрософт.офис.эксель.открыть "Мои документы\Забубенный.xls"
Кстати, уважаемый, если вы намекаете, что эксель очень быстрый, скажу вам это весьма опасное заблуждение :)

Ответить

Номер ответа: 4
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #4
Добавлено: 06.02.09 20:36
есть еще такие вещи как пайпы (pipes) (кстати в нет 3.5 есть), а также файлы, проецируемые в память (mapped file)(как-то так). возможно (скорее всего) они быстрее виндос сообщений

Ответить

Номер ответа: 5
Автор ответа:
 AleXandr



ICQ: 490033736 

Вопросов: 15
Ответов: 21
 Профиль | | #5 Добавлено: 07.02.09 18:08
А можно пару "цивилизованых методов межпроцесового взаимодействия"?

Ответить

Номер ответа: 6
Автор ответа:
 Oleg



ICQ: 407182478 

Вопросов: 9
Ответов: 10
 Профиль | | #6 Добавлено: 07.02.09 18:26
Кстати, уважаемый, если вы намекаете, что эксель очень быстрый, скажу вам это весьма опасное заблуждение

я тоже не разделяю иллюзий по этому поводу
Подключаешь модель экселя и рулишь ей как хочется, на VB6 элементарно.
А в .Net как всегда нужно закопаться куданибудь типа гейтс.билл.микрософт.офис.эксель.открыть "Мои документы\Забубенный.xls"

Правильно, только в этом случае обращение к Excel происходит через COM-компонент, т.е.
  1. Imports Microsoft.Office.Interop.Excel
  2. Dim App As New Application
  3.     Dim wb = App.Workbooks.Open("d:\DataBase.xls")
  4.     Dim ws As Worksheet = wb.Worksheets("Tree")


при этом VB создаёт собственные классы-обёртки вокруг COM-сервисов Excel, а это и является основной причиной "тормозов" при выполнении кода.

есть еще такие вещи как пайпы (pipes) (кстати в нет 3.5 есть), а также файлы, проецируемые в память (mapped file)(как-то так).

Пайпы то ведь используются как виртуальные каналы для передачи данных меж приложениями/компами, а в моём случае надо принимать/передавать маленькие порции данных, причём по команде одного из приложений, т.е. синхронно.
А можно пару "цивилизованых методов межпроцесового взаимодействия"?

Вот, вот.

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 08.02.09 16:15
AleXandr пишет:
А можно пару "цивилизованых методов межпроцесового взаимодействия"?

Если кто-то ждет что я зайду на Live Search, наберу там в поиске этот вопрос, скопирую вам ссылку и выдам пару язвительных замечаний по он заблуждается.

Ответить

Номер ответа: 8
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #8 Добавлено: 09.02.09 03:00
Любопытно, что могло так кардинально изменить привычки.

Ответить

Номер ответа: 9
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #9 Добавлено: 11.02.09 16:07

Dim PSI As New System.Diagnostics.ProcessStartInfo("процесс.exe", "/параметры";)
PSI.RedirectStandardOutput = True
PSI.RedirectStandardInput = True
PSI.UseShellExecute = False
PSI.CreateNoWindow = True
Dim PP = Process.Start(PSI)

...

'Писать так
PP.StandardInput.WriteLine(Buffer)

'А читать так
Buffer = PP.StandardOutput.ReadLine

Ответить

Номер ответа: 10
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #10 Добавлено: 11.02.09 22:28
Это как бы не совсем то - это доступ к консоли другого приложения

Ответить

Номер ответа: 11
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #11 Добавлено: 12.02.09 01:28
А можно пару "цивилизованых методов межпроцесового взаимодействия"?

да легко! Если речь идет о NET-приложениях на обоих концах, то вполне можно заюзать WCF,Remoting,DDE,TCP/IP и еще кучу технологий которые на всидку не вспомнил.. Все зависит от конкретной ситуации. Но в этом,конкретном случае, я приму сторону топикстартера.. имхо он прав. Вариант с отправкой сообщения самый безболезненный и легкореализуемый в случае с Excel

Теперь по теме.. К счастью, я не использую VB, поэтому пример набросал на C# но если очень надо, то перевести на VB труда не составит..

как в VB объявить/зарегестрировать новое событие для приложения и процедуру обработки этого события, для того, что бы из другого приложения можно было посылать сообщения, например через API SendMessage?

для регистрации события юзай API RegisterWindowMessage, а вариантов перехвата сообщений - туча:
- NativeWindow
- WndProc
- IMessageFilter
- и т.д.
опять таки повторюсь, но все зависит от конкретной ситуации..
Я покажу пример перехвата сообщения через реализацию интерфейса IMessageFilter(ты можешь заюзать любой другой способ)
В примере я все части(регистрация, отправка и перехват) реализовал в рамках одного приложения, но ты можешь разнести эти части как угодно.

1. Регистрация сообщения
  1.  
  2. using System;
  3. using System.Runtime.InteropServices;
  4. using System.Windows.Forms;
  5.  
  6. namespace SendMsg
  7. {
  8.  
  9.     static class Program
  10.     {
  11.  
  12.         [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
  13.         static extern int RegisterWindowMessage(string lpString);
  14.      
  15.       
  16.         [STAThread]
  17.         static void Main()
  18.         {
  19.             /* регистрируем свое событие */
  20.             MessageId = RegisterWindowMessage("MSG_VBNET_SAMPLE");
  21.  
  22.             /* запускаем приложение */
  23.             Application.EnableVisualStyles();
  24.             Application.SetCompatibleTextRenderingDefault(false);
  25.             Application.Run(new Form1());
  26.         }
  27.  
  28.         /* ID нашего события */
  29.         private static int m_messageId;
  30.         public static int MessageId
  31.         {
  32.             get { return m_messageId; }
  33.             private set
  34.             {
  35.                 m_messageId = value;
  36.             }
  37.         }
  38.     }
  39. }



2. Отправка и перехват

  1.  
  2. using System;
  3. using System.Runtime.InteropServices;
  4. using System.Windows.Forms;
  5. using System.Diagnostics;
  6.  
  7. namespace SendMsg
  8. {
  9.     /* имплементируем IMessageFilter */
  10.     public partial class Form1 : Form, IMessageFilter
  11.     {
  12.         /* API declaration */
  13.         [DllImport("user32.dll", CharSet = CharSet.Auto)]
  14.         static extern IntPtr PostMessage(IntPtr hWnd, int msg, IntPtr wParam, string lParam);
  15.  
  16.         public Form1()
  17.         {
  18.             InitializeComponent();
  19.  
  20.             /* добавляем нашу форму в очередь сообщений */
  21.             Application.AddMessageFilter(this);
  22.         }
  23.  
  24.         protected override void OnFormClosing(FormClosingEventArgs e)
  25.         {
  26.             /* удаляем из очереди
  27.              * необязательно, но я привык убирать мусор за собой
  28.              */
  29.             Application.RemoveMessageFilter(this);
  30.             base.OnFormClosing(e);
  31.         }
  32.  
  33.         private void DoWork(string message)
  34.         {
  35.             /* тут чего нибудь делаем ... */
  36.             MessageBox.Show(message, "VBNET.RU", MessageBoxButtons.OK);
  37.         }
  38.  
  39.         private void btnSend_Click(object sender, EventArgs e)
  40.         {
  41.             /* отправляем сообщение сами себе */
  42.             PostMessage(this.Handle, Program.MessageId, IntPtr.Zero, "Hello from vbnet.ru!");
  43.         }
  44.  
  45.         #region IMessageFilter Members
  46.  
  47.         public bool PreFilterMessage(ref Message m)
  48.         {
  49.             /*
  50.              * Проверяем ID полученного сообщения
  51.              * и если это наше сообщение, то вытаскиваем переданные параметры
  52.              */
  53.             if (m.Msg == Program.MessageId)
  54.             {
  55.                 /* получаем переданную строку или что там у тебя будет */
  56.                 string message = Marshal.PtrToStringAuto(m.LParam);
  57.                 /* вызываем какой нибудь метод для обработки или что то еще... */
  58.                 DoWork(message);
  59.             }
  60.  
  61.             return false;
  62.         }
  63.  
  64.         #endregion
  65.  
  66.     }
  67. }



стоит так же отметить тот факт, что при первом вызове RegisterWindowMessage, она зарегистрирует сообщение, а при последующих вызовах просто будет возвращать ID уже имеющегося сообщения. Таким образом ты можешь не волноваться по поводу того, что при каждом вызове это ф-ии будет разный ID, он будет неизменный в рамках сессии юзера.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам