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) указано:Цитата: Соответствие между типами данным Компонентного Паскаля и Си Касательно DWORD надо смотреть WinAPI-заголовки - синонимом какого типа он является.
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 байт) |
Автор: | Борис Рюмшин [ Среда, 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/ |