OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 24 Апрель, 2024 17:06

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




Начать новую тему Ответить на тему  [ Сообщений: 59 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Среда, 19 Август, 2009 06:59 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
и КП
Где бы об этом почитать? Вроде все перерыл, ничего не нашел
И вообще где почитать про портирование нужных библиотек на КП?


Последний раз редактировалось adva Среда, 19 Август, 2009 10:23, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соответствие типов Windows API
СообщениеДобавлено: Среда, 19 Август, 2009 08:42 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
adva писал(а):
и КП
Где бы об этом почитать? Вроде все перерыл, ничего не нашел
И вообще где почитать про портирование нужных библиотек на КП?
Полезно смотреть интерфейсный модуль WinApi в Блэкбоксе. Но Вы, наверное, туда заглядывали. Поэтому нужно поконкретней уточнять, что непонятно. Может, в этой веточке и накопятся вопросы-ответы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соответствие типов Windows API
СообщениеДобавлено: Среда, 19 Август, 2009 10:22 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
Может тема и не правильно названа, не очень разбираюсь (может это соответствие типов C , но тоже не нашел в ЧЯ) Конкретно интересует тип DWORD


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2009 10:38 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
INTEGER должен быть. DWORD же 4 байта?
INTEGER - тоже 4 байта.
Но в КП не беззнаковых типов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2009 13:33 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Более того, разрядность INTEGER зависит от реализации. На 64-разрядной машине INTEGER д.б. восьмибайтовым.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2009 17:08 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
adva писал(а):
и КП
Где бы об этом почитать? Вроде все перерыл, ничего не нашел
И вообще где почитать про портирование нужных библиотек на КП?

Почитать особо негде… Все развлекаются как могут.
Что касается типа DWORD, то в зависимости от контекста, можно использовать или INTEGER (4 байта, 32 бита), или SET (тоже 32 бита).
В обоих случаях придется приводить явно через SYSTEM.VAL


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2009 17:16 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
с dword вроде разобрался

А как портировать такую конструкцию с делфи?

Код:
type
  PMIRANDAHOOK=^TMIRANDAHOOK;
  TMIRANDAHOOK=function (wParam,lParam:DWord):integer;cdecl;


указатель вроде больше не используется интересует function, и cdecl . Если я правильно понял, это системынй флаг [ccall] , но он применяется, если процедура это не процедурный тип ( не знаю правильно ли выразился, в терминах пока слабоват). А в данном случае компилятор если выставить этот флаг выдает ошибку

Хотя про указатель наверное тоже лучше сразу выяснить, думаю пригодится в дальнейшем. В КП же указатели как я понял только на массивы и записи, а в данном случае как быть?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2009 17:24 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
adva писал(а):
с dword вроде разобрался

А как портировать такую конструкцию с делфи?

Код:
type
  PMIRANDAHOOK=^TMIRANDAHOOK;
  TMIRANDAHOOK=function (wParam,lParam:DWord):integer;cdecl;


указатель вроде больше не используется интересует function, и cdecl . Если я правильно понял, это системынй флаг [ccall] , но он применяется, если процедура это не процедурный тип ( не знаю правильно ли выразился, в терминах пока слабоват). А в данном случае компилятор если выставить этот флаг выдает ошибку

Хотя про указатель наверное тоже лучше сразу выяснить, думаю пригодится в дальнейшем. В КП же указатели как я понял только на массивы и записи, а в данном случае как быть?

Предположим, что DWORD вы уже определили.
Тогда эту всю конструкцию нужно определять так:
Код:
TYPE
  TMIRANDAHOOK = PROCEDURE [ccall] (wParam,lParam:DWORD):INTEGER;

При этом, важным условием является тот факт, что [ccall] работает только в том случае, если в этом модуле импортируется SYSTEM. Иначе – ошибка.
Проверено при портировании Anti-grain geometry.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2009 17:26 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
Может быть кто-нибудь имеет возможность выложить вещи, которые пришлось портировать (исходники источника и исходники на КП). Думаю это помогло бы разобраться в вопросе. А то что ни строка, то репу чешешь :)

Ну или на почту adva-cg()yandex()ru


Последний раз редактировалось adva Среда, 19 Август, 2009 17:31, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2009 17:30 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
Димыч писал(а):
adva писал(а):
с dword вроде разобрался

Тогда эту всю конструкцию нужно определять так:
Код:
TYPE
  TMIRANDAHOOK = PROCEDURE [ccall] (wParam,lParam:DWORD):INTEGER;

При этом, важным условием является тот факт, что [ccall] работает только в том случае, если в этом модуле импортируется SYSTEM. Иначе – ошибка.
Проверено при портировании Anti-grain geometry.



Все равно компилятор выдает:
declaration followed by incorrect symbol
перед [ccall]

SYSTEM импортирован


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2009 17:32 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
adva писал(а):
Димыч писал(а):
adva писал(а):
с dword вроде разобрался

Тогда эту всю конструкцию нужно определять так:
Код:
TYPE
  TMIRANDAHOOK = PROCEDURE [ccall] (wParam,lParam:DWORD):INTEGER;

При этом, важным условием является тот факт, что [ccall] работает только в том случае, если в этом модуле импортируется SYSTEM. Иначе – ошибка.
Проверено при портировании Anti-grain geometry.



Все равно компилятор выдает:
declaration followed by incorrect symbol
перед [ccall]

SYSTEM импортирован

А можно полный модуль (сюда или вложением)?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2009 17:35 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
Ну вот собственно:

Код:
MODULE MirandaNewpluginapi;

(* тодо ccall *)

(*
*)

IMPORT SYSTEM, WinApi, MirandaM_plugins;

TYPE
   Point* = RECORD
      x,
      y: INTEGER;
   END;

TYPE
   PPLUGININFO* = POINTER TO TPLUGININFO; 
   TPLUGININFO = RECORD [untagged]
      cbSize: INTEGER;   
      shortName: WinApi.PtrSTR;
      version: SET;
      description: WinApi.PtrSTR;
      author: WinApi.PtrSTR;
      authorEmail: WinApi.PtrSTR;
      copyright: WinApi.PtrSTR;
      homepage: WinApi.PtrSTR;
      isTransient: BYTE;      (* leave this as 0 for now    *)
      replacesDefaultModule: INTEGER; (* one of the DEFMOD_ constants in m_plugins.h or zero
                                    if non-zero, this will supress the loading of the specified built-in module
                                    with the implication that this plugin provides back-end-compatible features *)
                                    
   END;
   
TYPE
   TMIRANDAHOOK = PROCEDURE [ccall] (wParam: WinApi.WPARAM; lParam: WinApi.LPARAM): INTEGER;
   TMIRANDASERVICE = PROCEDURE  (wParam: WinApi.WPARAM; lParam: WinApi.LPARAM): INTEGER;
   
CONST
   CALLSERVICE_NOTFOUND = 80000000H;
   MAXMODULELABELLENGTH=64;
   

END MirandaNewpluginapi.


Пробую разобраться с написанием плагина для Миранды, может кто уже делал?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2009 17:39 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
И еще сразу уж вопрос:

в документации ЧЯ:

нашел такую конструкцию:
Код:

TYPE
  GUID = ARRAY 4 OF INTEGER;

  PtrIUnknown = POINTER TO RECORD [untagged]
    vtbl: POINTER TO RECORD [untagged]
      QueryInterface: PROCEDURE (this: PtrIUnknown; IN iid: GUID; OUT obj: PtrIUnknown): INTEGER;
      AddRef: PROCEDURE (this: PtrIUnknown): INTEGER;
      Release: PROCEDURE (this: PtrIUnknown): INTEGER;
    END
  END;



Интересует параметр "this: PtrIUnknown" в методах. Он всегда должен указываться? Или в каких случаях?

PS По этому же примеру интересует "vtbl". Получается можно предварительно не задвать его тип запись, а непосредственно в таком виде расписать?


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

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
В 1.5 ошибка есть, в 1.6 компилится нормально… А я только с 1.6 работал ;)


Последний раз редактировалось Димыч Среда, 19 Август, 2009 17:48, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2009 17:47 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
adva писал(а):
И еще сразу уж вопрос:

в документации ЧЯ:

нашел такую конструкцию:
Код:

TYPE
  GUID = ARRAY 4 OF INTEGER;

  PtrIUnknown = POINTER TO RECORD [untagged]
    vtbl: POINTER TO RECORD [untagged]
      QueryInterface: PROCEDURE (this: PtrIUnknown; IN iid: GUID; OUT obj: PtrIUnknown): INTEGER;
      AddRef: PROCEDURE (this: PtrIUnknown): INTEGER;
      Release: PROCEDURE (this: PtrIUnknown): INTEGER;
    END
  END;



Интересует параметр "this: PtrIUnknown" в методах. Он всегда должен указываться? Или в каких случаях?

PS По этому же примеру интересует "vtbl". Получается можно предварительно не задвать его тип запись, а непосредственно в таком виде расписать?

Ну тут длинный разговор… :)
Если коротко, то это «кишки» интерфейсов Windows, переведенные на КП.
Так вот компилятор (тот который C и C++) автоматом подставляет this. Остальные должны это руками делать. И this нужно указывать всегда.
Собственно, self, this и прочие type-bound процедуры – это по разному передаваемый указатель на экземпляр. А vtbl здесь – один из вариантов реализации таблицы методов (не единственный).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2009 17:56 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
Димыч писал(а):
Если коротко, то это «кишки» интерфейсов Windows, переведенные на КП.
Так вот компилятор (тот который C и C++) автоматом подставляет this. Остальные должны это руками делать. И this нужно указывать всегда.
Собственно, self, this и прочие type-bound процедуры – это по разному передаваемый указатель на экземпляр. А vtbl здесь – один из вариантов реализации таблицы методов (не единственный).


Ну вот, теперь хоть знаю куда рыть дальше :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соответствие типов Windows API
СообщениеДобавлено: Среда, 19 Август, 2009 22:11 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
adva писал(а):
Может тема и не правильно названа, не очень разбираюсь (может это соответствие типов C , но тоже не нашел в ЧЯ) Конкретно интересует тип DWORD
В особенностях платформы (platform-specific issues) указано:
Цитата:
Соответствие между типами данным Компонентного Паскаля и Си

unsigned char = SHORTCHAR (1 байт)
WCHAR = CHAR (2 байта)
signed char = BYTE (1 байт)
short = SHORTINT (2 байта)
int = INTEGER (4 байта)
long = INTEGER (4 байта)
LARGE_INTEGER = LONGINT (8 байт)
float = SHORTREAL (4 байта)
double = REAL (8 байт)
Касательно DWORD надо смотреть WinAPI-заголовки - синонимом какого типа он является.


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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Август, 2009 08:48 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
adva писал(а):
И еще сразу уж вопрос:

Интересует параметр "this: PtrIUnknown" в методах. Он всегда должен указываться? Или в каких случаях?

Это как в Питоне: методы задаются с явным параметром this. В отличие от Сишного мира, где this компилятором запихивается неявно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Август, 2009 08:55 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 358
Откуда: Россия, Стерлитамак
1) Тогда такой вопрос, почему в вышеприведенном примере "this: PtrIUnknown" находится первым среди формальных параметров (в скобках), а не в принимающем параметре, как это написано в документации для блек бокс

Не
Код:
PROCEDURE (this: PtrIUnknown) Work ();


а
Код:
PROCEDURE Work (this: PtrIUnknown);


2) Тоже думаю что в ВИКИ надо, если смогу решить свою задачу, то для себя набросаю какаю нибудь доку, что в следующий раз было проще. Ее сюда и выложу (но это не скоро). Но знаний на грамотное описание явно не хватит. Если вдруг кто еще возьмется буду рад.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 59 ]  На страницу 1, 2, 3  След.

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


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

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


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

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