OberonCore
https://forum.oberoncore.ru/

Из .Net в BlackBox и обратно (процедуры обратного вызова)
https://forum.oberoncore.ru/viewtopic.php?f=35&t=1143
Страница 1 из 1

Автор:  Сергей Губанов [ Пятница, 29 Август, 2008 17:50 ]
Заголовок сообщения:  Из .Net в BlackBox и обратно (процедуры обратного вызова)

Можно создать в BlackBox DLL, которую загрузить из программы написанной под .Net, передать ей всяческие процедуры обратного вызова и управлять дотнетом из этой обероновской DLL.

Пример
Код:
MODULE TestCallback;

   TYPE
      Callback* = PROCEDURE (n: INTEGER);

   VAR
      callback: Callback;
      n: INTEGER;

   PROCEDURE Setup* (c: Callback);
   BEGIN callback := c
   END Setup;

   PROCEDURE Do*;
   BEGIN callback(n); INC(n)
   END Do;

END TestCallback.

DevLinker.LinkDll TestCallback.dll := TestCallback# ~


Код:
namespace Callback
{
   class Program
   {
      public delegate void Callback (int n);

      [System.Runtime.InteropServices.DllImport("TestCallback.dll")]
      public static extern void Setup (Callback c);

      [System.Runtime.InteropServices.DllImport("TestCallback.dll")]
      public static extern void Do ();

      static void Main (string[] args)
      {
         Callback callback = new Callback(MyCallback);
         Setup(callback);
         Do(); Do(); Do(); Do();
         System.Console.ReadLine();
      }

      private static void MyCallback (int n)
      {
         System.Console.WriteLine("Callback: " + n);
      }
   }
}

Автор:  Info21 [ Пятница, 29 Август, 2008 18:16 ]
Заголовок сообщения:  Re: Из .Net в BlackBox и обратно (процедуры обратного вызова)

Ценно.

Автор:  Борис Рюмшин [ Пятница, 29 Август, 2008 18:26 ]
Заголовок сообщения:  Re: Из .Net в BlackBox и обратно (процедуры обратного вызова)

Info21 писал(а):
Ценно.

Только чую, это не совсем для начинающих. :)

P.S. Фёдор Васильевич, с юбилеем, у вас 1000 сообщений на форуме. :mrgreen:

Автор:  Vlad [ Пятница, 29 Август, 2008 18:46 ]
Заголовок сообщения:  Re: Из .Net в BlackBox и обратно (процедуры обратного вызова)

Сергей Губанов писал(а):
Можно создать в BlackBox DLL, которую загрузить из программы написанной под .Net, передать ей всяческие процедуры обратного вызова и управлять дотнетом из этой обероновской DLL.


А вот вы попробуйте не int, а хотя бы string туда-сюда передать, и оцените практическую ценность такого подхода :)

Автор:  Info21 [ Суббота, 30 Август, 2008 05:43 ]
Заголовок сообщения:  Re: Из .Net в BlackBox и обратно (процедуры обратного вызова)

Vlad писал(а):
... А вот вы попробуйте не int, а хотя бы string туда-сюда передать, и оцените практическую ценность такого подхода :)

Для начала важна принципиальная возможность. Че-нить придумать наверняка можно будет. Уж чем-чем, а хитростью приматы не обделены.

Автор:  Сергей Губанов [ Понедельник, 01 Сентябрь, 2008 14:29 ]
Заголовок сообщения:  Re: Из .Net в BlackBox и обратно (процедуры обратного вызова)

Если строка идёт как аргумент функции, то особой проблемы нет. Проблема есть если строка идёт как поле записи. В .Net строки ссылочные. Пересылать указатели на объекты смысла нет: Блэкбоксовый сборщик мусора чужие указатели собирать не будет, равно как и дотнетный, зато объекты на которые по их мнению никто не ссылается они оба угрохают. Поэтому имеет смысл устроить канал обмена сериализованным представлением объектов сообщений. Тоже самое сериализованное представление можно было бы прокачивать через TCP соединение, но через обратный вызов процедур будет экономнее.

Автор:  Сергей Губанов [ Понедельник, 22 Сентябрь, 2008 11:43 ]
Заголовок сообщения:  Re: Из .Net в BlackBox и обратно (процедуры обратного вызова)

Два дня возился с тем, что калбасная функция вызывалась как-то криво. Оказывается указатель на неё нужно получать так:

System.IntPtr unmanagedFunctionPointer = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(myDelegate);

Автор:  id_ler [ Суббота, 06 Июнь, 2009 11:38 ]
Заголовок сообщения:  Re: Из .Net в BlackBox и обратно (процедуры обратного вызова)

Есть ли смысл открыть тему под названием, например, «Конструктор WinApi-функций», где можно было бы обсудить, например, как правильно реализовать сишные типы данных в Компонентном Паскале? Вот пример конструктора сообщений (функция MessageBox):
Код:
MODULE ModuleA;
   IMPORT StdLog, WinApi;
      
   VAR   a*, b*: INTEGER;
      c*, d*: ARRAY 20 OF CHAR;
      e*, f*: ARRAY 20 OF SHORTCHAR;
                        
   PROCEDURE StringToString* (in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
      VAR i, max: INTEGER;
   BEGIN i := 0; max := LEN(out)-1;
      WHILE (in[i] # 0X) & (i < max) DO
         IF ORD(in[i]) < 256 THEN out[i] := in[i] END;
         INC(i)
      END;
      out[i] := 0X
   END StringToString;
            
   PROCEDURE Messagebox*():INTEGER;
      VAR
         hWnd: WinApi.HWND;
         g, h: ARRAY 20 OF CHAR;
         lpText, lpCaption: WinApi.PtrSTR;
         uType: SET;
   BEGIN
      hWnd := a;
      StringToString(c, g);
      f := SHORT(g);
      StringToString(d, h);
      e := SHORT(h);
      lpText := f;
      lpCaption := e;
      uType := {b};
      RETURN WinApi.MessageBox(hWnd, lpText, lpCaption, uType);
   END Messagebox;
   
   PROCEDURE Start*;
      VAR n: INTEGER;
   BEGIN
      n := Messagebox();
      StdLog.Int(n); StdLog.Ln
   END Start;
   
END ModuleA.

После компиляции модуля, надо создать «New Form...» и выполнить «Open As Aux Dialog». Изменение параметра uType позволяет создавать сообщения с восклицанием, предупреждением, вопросом и т.д.

Автор:  id_ler [ Понедельник, 08 Июнь, 2009 09:46 ]
Заголовок сообщения:  Re: Из .Net в BlackBox и обратно (процедуры обратного вызова)

id_ler писал(а):
Есть ли смысл открыть тему под названием, например, «Конструктор WinApi-функций», где можно было бы обсудить, например, как правильно реализовать сишные типы данных в Компонентном Паскале?
Нашел в ветке Системные вопросы темы по WinApi-функциям. Как начинающий я мало-что понимаю в системных вопросах, поэтому там раньше не посмотрел. При запуске на исполнение модуля в BlackBox'е, выводящего сообщение MessageBox, появляется несколько вопросов, которые прошу пояснить.
1.Переменные с маркером* для массивов объявляются стандартно и абсолютно одинаково, но при совмещении на Форме полей ввода массива CHAR с соответствующими графическими элементами массива SHORTCHAR – доступным для ввода строки при запуске программы остается поле ввода только одно.
2.Если поле ввода дескриптора оставить пустым, то при старте программы в это поле будет записан ноль. А каким реально будет дескриптор сообщения? Это можно проверить?
Я где-то читал, что при программировании в BlackBox'е использование платформозависимых элементов не приветствуется. Стоит ли развивать эту тему? Например, дополнить конструктор сообщений выбором параметра uType из ListBox'а. Если да, то в какую ветку перенести эту тему?

Автор:  Илья Ермаков [ Понедельник, 08 Июнь, 2009 16:27 ]
Заголовок сообщения:  Re: Из .Net в BlackBox и обратно (процедуры обратного вызова)

Кроме того, не приветствуется использование модальных (блокирующих) диалогов. :)

Автор:  id_ler [ Понедельник, 08 Июнь, 2009 19:03 ]
Заголовок сообщения:  Re: Из .Net в BlackBox и обратно (процедуры обратного вызова)

Илья Ермаков писал(а):
Кроме того, не приветствуется использование модальных (блокирующих) диалогов.

Спасибо за пояснение. Я только хотел в образовательных целях практически рассмотреть функции, о которых так много написано в разной литературе.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/