LoadCursor может вернуть NULL в случае ошибки. Вы не проверяете это.
Сам код ошибки можно получить, как обычно в WinAPI, используя GetLastError. Получить текстовое описание ошибки по коду можно через FormatMessage, пример смотрите тут.
Ну, не так может быть то, что курсор назначаен на уровне класса окна (задается при регистрации класса приложением, но можно изменить и после) - тогда при движении мыши система заменяет ваш курсор на зарегистрированный. Подробности читать тут.