OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 18:24

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 29 Август, 2008 17:50 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Можно создать в 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);
      }
   }
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 29 Август, 2008 18:16 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Ценно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 29 Август, 2008 18:26 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Info21 писал(а):
Ценно.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 29 Август, 2008 18:46 

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 30 Август, 2008 05:43 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Vlad писал(а):
... А вот вы попробуйте не int, а хотя бы string туда-сюда передать, и оцените практическую ценность такого подхода :)

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Сентябрь, 2008 14:29 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Сентябрь, 2008 11:43 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Два дня возился с тем, что калбасная функция вызывалась как-то криво. Оказывается указатель на неё нужно получать так:

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 06 Июнь, 2009 11:38 

Зарегистрирован: Суббота, 06 Июнь, 2009 07:52
Сообщения: 329
Есть ли смысл открыть тему под названием, например, «Конструктор 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 позволяет создавать сообщения с восклицанием, предупреждением, вопросом и т.д.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Июнь, 2009 09:46 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Июнь, 2009 16:27 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Кроме того, не приветствуется использование модальных (блокирующих) диалогов. :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Июнь, 2009 19:03 

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB