Третий параметр набирается как HANDLE
, поэтому IMO, чтобы выполнить явный контракт функции, следует сохранить свойство как HANDLE
, выделив блок HGLOBAL
памяти.Однако, как отмечено в комментариях ниже, MSDN утверждает, что может быть указано любое значение, и действительно, когда я пробую его в Windows 7, используя ...
SetProp(hWnd, _T("TestProp"), (HANDLE)(10)); // or (HANDLE)(short*)(10)
...
(short)GetProp(hWnd, _T("TestProp"));
... Я получаю 10 от GetProp.Я подозреваю, что где-то между вашим SetProp и GetProp происходит одна из двух вещей: (1) значение hWnd отличается - вы проверяете другое окно или (2) проблема синхронизации - свойство еще не установлено илибыл удален.
Если вы хотите использовать HGLOBAL
вместо того, чтобы следовать определенным типам сигнатуры функции, вы можете следовать этому примеру в MSDN .
Несмотря на то, что HANDLE
является просто указателем, это особый тип данных, который выделяется при вызовах в Windows API.У многих вещей есть дескрипторы: значки, курсоры, файлы, ... Если в документации явно не указано иное, чтобы использовать блок данных, такой как short
, когда функция вызывает HANDLE
, вам нужен дескриптор памяти (an HGLOBAL
).
Приведенный выше пример кода копирует данные в виде строки, но вместо этого вы можете установить их как другой тип данных:
// TODO: Add error handling
hMem = GlobalAlloc(GPTR, sizeof(short));
lpMem = GlobalLock(hMem);
if (lpMem != NULL)
{
*((short*)lpMem) = 10;
GlobalUnlock(hMem);
}
Чтобы прочитать их обратно, когда выGetProp
чтобы получить HANDLE
, вы должны заблокировать его для чтения памяти:
// TODO: Add error handling
short val;
hMem = (HGLOBAL)GetProp(hwnd, ...);
if (hMem)
{
lpMem = GlobalLock(hMem);
if (lpMem)
{
val = *((short*)lpMem);
}
}