Задача SetProp - PullRequest
       7

Задача SetProp

1 голос
/ 07 мая 2011

Может кто-нибудь сказать мне, почему следующий код не работает? Я не получаю никаких ошибок компилятора.

short value = 10;
SetProp(hCtl, "value", (short*) value);

Ответы [ 2 ]

2 голосов
/ 07 мая 2011

Третий параметр набирается как 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);
    }
}
0 голосов
/ 09 апреля 2016

Я бы создал short в куче, чтобы он продолжал существовать, или, возможно, сделал бы его глобальным, что, возможно, и вы. Также приведение к short адресу должно быть void * или HANDLE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...