Вопрос

Просматривая код, я нашел вызов Опенпринтер().Код компилируется и работает нормально.Но мы проходим HANDLE вместо LPHANDLE (как указано в MSDN).Я узнал, что в windef.h существует следующее объявление:

typedef HANDLE FAR          *LPHANDLE;

Что означает ЛП?Должен ли я использовать LPHANDLE, или оставь HANDLE?

Это было полезно?

Решение

LP означает длинный указатель.В данном случае это указатель на дескриптор.

HANDLE h = <winapi function>();
LPHANDLE ph = &h;

Вы можете использовать его так же, как и дескриптор, разыменовав указатель:

HANDLE anotherh = *ph;
or
<winapi function>(*ph, ...);

Другие советы

«LP» означает длинный указатель.

HANDLE != LPHANDLE, так же, как DWORD != DWORD* (или LPDWORD)

А ДАЛЕКО конструкция восходит к временам Процессор 8086/8088 и модальные модели сегментированной памяти, которые он использовал.В те дни вы могли бы ОКОЛО и ДАЛЕКО указатели на память.

А LP (длинная стрелка) — это просто похмелье от Венгерская нотация Microsoft из тех прежних дней.

В наши дни модель памяти Win32 плоская, поэтому ОКОЛО и ДАЛЕКО указатели в основном одинаковы.Но пока ближний указатель теперь то же самое, что и Дальний Пойтнер это не означает, что указатель — это то же самое, что и дескриптор.

И просто чтобы дать вам немного общего, длинные указатели, также называемые дальними указателями, отличаются от обычных 16-битных указателей в 16-битных окнах.В ОС использовалась модель сегментированной памяти, в которой вы могли смещаться от сегмента или иметь сегмент + смещение, которое было длинным указателем.Для этих длинных указателей использовалась венгерская нотация LP, которая до сих пор используется в API Windows по этим устаревшим причинам.

Конечно, в 32-битных и 64-битных ОС Windows используется плоская модель памяти, и в этих ОС нет различия между указателями (хотя PAE добавляет что-то концептуально похожее).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top