Вопрос
Просматривая код, я нашел вызов Опенпринтер().Код компилируется и работает нормально.Но мы проходим 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 добавляет что-то концептуально похожее).