ЛПХАНДЛ против РУЧКИ - PullRequest
3 голосов
/ 24 декабря 2008

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

typedef HANDLE FAR          *LPHANDLE;

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

Ответы [ 4 ]

7 голосов
/ 24 декабря 2008

"LP" обозначает Long Pointer.

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

6 голосов
/ 24 декабря 2008

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

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

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

HANDLE anotherh = *ph;
or
<winapi function>(*ph, ...);
4 голосов
/ 08 января 2009

Конструкция FAR восходит к дням использования процессора 8086/8088 и сегментированной памяти, которые он использовал. В те дни вы могли иметь NEAR и FAR указатели на память.

LP (длинный указатель) - это просто похмелье от Венгерской нотации Microsoft тех ранних дней.

В наши дни модель памяти Win32 плоская, поэтому указатели NEAR и FAR в основном совпадают. Но хотя ближний указатель теперь такой же, как дальний poitner , это не означает, что указатель такой же, как дескриптор.

3 голосов
/ 24 декабря 2008

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

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

...