#c #winapi #pascal
#c #winapi #pascal
Вопрос:
Я просматривал приложение, портируемое с C на PASCAL (win32 API), и не могу понять, почему тип PAINTSTRUCT в C изменяется на TpaintStruct в PASCAL.
Вот фрагменты, где это можно было увидеть:
long FAR PASCAL ClientWndProc(HWND hwnd, UINT msg, UINT mp1, LONG mp2)
{
static int cxClient, cyClient;
HBITMAP hbm;
BITMAP bm;
PAINTSTRUCT ps;
...
превращается в
function ClientWndProc(hwnd: WinTypes.HWND; msg: Word; mp1: Word; mp2: Longint): Longint; export;
var
hdc: WinTypes.HDC;
hdcMem: WinTypes.HDC;
hbm: WinTypes.HBITMAP;
bm: TBITMAP;
ps: TpaintStruct;
...
Мне нужно самому портировать одно приложение. Должно ли то же самое применяться и к TEXTMETRIC
типу? Должен ли я вызывать это TtextMetric
на PASCAL?
Комментарии:
1. В Pascal ничего не говорится о Windows. Вы говорите о Delphi? Или, возможно, Borland TurboPascal?
Ответ №1:
В Delphi (и Turbo Pascal до него, IIRC) всегда был обычай добавлять к типам префиксы с T
, как в TStringList
, TButton
, TCustomForm
, TDateTime
и так далее.
Вы можете найти TTextMetric
(и TPaintStruct
), объявленные для вас уже в Windows.pas
модуле, наряду со многими стандартными функциями WinAPI.
( WinTypes
кстати, устарело. Это старый перенос из Delphi 1 для 16-разрядных приложений, и он автоматически заменяется Windows в более поздних версиях Delphi.)
Комментарии:
1. Таким образом, модуль Windows.pas в основном принимает каждую отдельную функцию API и повторно объявляет ее с префиксом «T»? Разве это полностью не сводит на нет назначение независимых от языка функций win32 API?
2. Объявления Win32 API подходят только для компиляторов C.
3. @joncys, нет, это совсем не то, что я сказал. Функции API определены так, как вы и ожидали. Типы имеют префикс
T
, а не функции. И невозможно «использовать каждую отдельную функцию API» где угодно;Windows.pas
объявляются многие, но никоим образом не все, из наиболее часто используемых.4. @KenWhite Прошу прощения, я по глупости перепутал типы с функциями в своем комментарии. Для меня все еще не имеет смысла, почему вы назвали бы их по-другому. О, и эта университетская задача включает в себя перенос приложений OS / 2 на win32 API, поэтому все «устаревшее» добавляет иронии.
5. @joncys, это проблема совместимости / пользовательских настроек. Поскольку во всех Borland Pascal (Turbo или Delphi) объявлены типы, начинающиеся с
T
(я подозреваю, чтобы их было легче распознать как таковые), и в VCL и RTL есть тысячи такихT
объявлений типов, имело смысл добавитьT
также типы в WinAPI для согласованности. (По крайней мере, это мое предположение, во всяком случае).
Ответ №2:
Это просто для того, чтобы лучше соответствовать соглашению об именовании Pascal. Вы можете следовать ему, если хотите, и ваш код будет выглядеть более похожим на Pascal, но ничего плохого не произойдет, если вы этого не сделаете.
Ответ №3:
Изначально в Pascal было унифицированное пространство имен для идентификаторов. Это означает, что X как тип и X как имя переменной, поле и т.д. Будут конфликтовать.
Чтобы исправить API, которые использовали тот факт, что это работает по-другому в C (и, следовательно, не зависели от языка), было введено соглашение о типах префиксов с T.
Afaik это уже было сделано для Turbo Vision, пакета, для которого ООП был добавлен в (Turbo) Pascal. Который, afaik, был портом с C .
Позже, в Delphi эта схема была расширена. (используя, например, «A» для имен параметров). Но некоторые венгерские обозначения в Delphi, возможно, также были полезны разработчику GUI.
Afaik только в D4, Delphi разрешил, чтобы идентификаторы типов полей совпадали с именами полей.
Комментарии:
1. Извините. не имена записей, а имена полей в зависимости от типов полей. Я исправил это.