OberonCore
https://forum.oberoncore.ru/

Соответствие типов Windows API и портирование на КП
https://forum.oberoncore.ru/viewtopic.php?f=2&t=1773
Страница 1 из 3

Автор:  adva [ Среда, 19 Август, 2009 06:59 ]
Заголовок сообщения:  Соответствие типов Windows API и портирование на КП

и КП
Где бы об этом почитать? Вроде все перерыл, ничего не нашел
И вообще где почитать про портирование нужных библиотек на КП?

Автор:  Info21 [ Среда, 19 Август, 2009 08:42 ]
Заголовок сообщения:  Re: Соответствие типов Windows API

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

Автор:  adva [ Среда, 19 Август, 2009 10:22 ]
Заголовок сообщения:  Re: Соответствие типов Windows API

Может тема и не правильно названа, не очень разбираюсь (может это соответствие типов C , но тоже не нашел в ЧЯ) Конкретно интересует тип DWORD

Автор:  Валерий Лаптев [ Среда, 19 Август, 2009 10:38 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

INTEGER должен быть. DWORD же 4 байта?
INTEGER - тоже 4 байта.
Но в КП не беззнаковых типов.

Автор:  Иван Кузьмицкий [ Среда, 19 Август, 2009 13:33 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

Более того, разрядность INTEGER зависит от реализации. На 64-разрядной машине INTEGER д.б. восьмибайтовым.

Автор:  Димыч [ Среда, 19 Август, 2009 17:08 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

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

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

Автор:  adva [ Среда, 19 Август, 2009 17:16 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

с dword вроде разобрался

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

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


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

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

Автор:  Димыч [ Среда, 19 Август, 2009 17:24 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

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.

Автор:  adva [ Среда, 19 Август, 2009 17:26 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

Может быть кто-нибудь имеет возможность выложить вещи, которые пришлось портировать (исходники источника и исходники на КП). Думаю это помогло бы разобраться в вопросе. А то что ни строка, то репу чешешь :)

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

Автор:  adva [ Среда, 19 Август, 2009 17:30 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

Димыч писал(а):
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 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

adva писал(а):
Димыч писал(а):
adva писал(а):
с dword вроде разобрался

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

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



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

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

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

Автор:  adva [ Среда, 19 Август, 2009 17:35 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

Ну вот собственно:

Код:
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.


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

Автор:  adva [ Среда, 19 Август, 2009 17:39 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

И еще сразу уж вопрос:

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

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

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 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

В 1.5 ошибка есть, в 1.6 компилится нормально… А я только с 1.6 работал ;)

Автор:  Димыч [ Среда, 19 Август, 2009 17:47 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

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 здесь – один из вариантов реализации таблицы методов (не единственный).

Автор:  adva [ Среда, 19 Август, 2009 17:56 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

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


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

Автор:  Евгений Темиргалеев [ Среда, 19 Август, 2009 22:11 ]
Заголовок сообщения:  Re: Соответствие типов Windows API

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 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

Собрать бы всё и в wiki...

Автор:  Валерий Лаптев [ Четверг, 20 Август, 2009 08:48 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

adva писал(а):
И еще сразу уж вопрос:

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

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

Автор:  adva [ Четверг, 20 Август, 2009 08:55 ]
Заголовок сообщения:  Re: Соответствие типов Windows API и портирование на КП

1) Тогда такой вопрос, почему в вышеприведенном примере "this: PtrIUnknown" находится первым среди формальных параметров (в скобках), а не в принимающем параметре, как это написано в документации для блек бокс

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


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


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

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