CreateEvent на экране входа в систему Windows-7

Я задаю этот вопрос, потому что оказывается, что есть некоторые трудности с написанием приложения-заставки в Delphi, которое может работать с экрана входа в систему.

См. вопрос: экранная заставка входа в Windows 7 в Delphi

Я сузил проблему (или по крайней мере одну проблему) до конкретного вызова Win API CreateEvent.

SyncEvent := CreateEvent(nil, True, False, '');
if SyncEvent = 0 then
  RaiseLastOSError;

Этот код не работает только в том случае, если он вызывается с экрана входа в систему. И GetLastError возвращает, что доступ запрещен. Таким образом, ограничения безопасности на экране входа в систему не позволяют CreateEvent(nil, True, False, ''); создать желаемое событие.

(Я действительно не понимаю, как событие может быть опасным для безопасности.)

Итак, вопрос: можно ли создать событие на экране входа в систему? Предположительно через:

  • Используя соответствующий lpEventAttributes
  • Или вместо этого вызов CreateEventEx.

Несмотря на то, что проблема возникла в Delphi, она больше связана с Win API. Поэтому не стесняйтесь отвечать на выбранном вами языке.


person Disillusioned    schedule 13.07.2014    source источник
comment
Крейг, я абсолютно не эксперт в этом, и, возможно, мне это приснилось, но я уверен, что в группах Borland еще в эпоху Win2k или даже NT был вопрос об этом, и ответ в то время был таким: предоставьте замену Gina.Dll, если вы хотите что-то сделать внутри станции Windows на экране входа в систему. В соответствии с этим q, это другой пост XP, но я полагаю, вы знали, что: stackoverflow.com/questions/1917790/   -  person MartynA    schedule 13.07.2014
comment
@MartynA Должен признаться, многое из этого для меня ново. Я только что провел небольшое расследование, потому что меня заинтересовал вопрос о заставках для входа в систему. Однако у меня есть сомнения относительно актуальности GINA, потому что этот вопрос предполагает, что GINA была заменена в Windows Vista. Кроме того, я не знаю, что на самом деле намеревался сделать задающий вопрос о заставке входа в систему. Возможно, он хотел написать простую заставку в виде слайд-шоу. Получается, что из стандартных заставок Win-7 работает только пустой экран из-за ограничений Direct3D.   -  person Disillusioned    schedule 14.07.2014
comment
Попробуйте установить последний параметр CreateEvent() на nil вместо ''. Существует разница между нулевым указателем и указателем на строку нулевой длины. В документации ничего не говорится о длина строки обрабатывается иначе, чем любая другая именованная строка. Если вы хотите безымянное событие, используйте nil.   -  person Remy Lebeau    schedule 14.07.2014
comment
@RemyLebeau Отличный улов! Пожалуйста, напишите как ответ.   -  person Disillusioned    schedule 14.07.2014
comment
@Anonymous downvoter: Не могли бы вы поделиться, что не так с вопросом, чтобы в следующий раз я мог сделать лучше?   -  person Disillusioned    schedule 14.07.2014


Ответы (1)


Попробуйте установить последний параметр CreateEvent() на nil вместо '' . Существует разница между нулевым указателем и указателем на строку нулевой длины. В документации ничего не говорится о нулевой длине. строка обрабатывается иначе, чем любая другая именованная строка. Так что, возможно, есть еще одно событие с нулевой длиной имени, которое существует где-то еще на вашем компьютере, к которому ваше приложение не имеет доступа, поэтому возникает ошибка «Отказано в доступе», когда CreateEvent() пытается получить доступ к существующему событию и терпит неудачу. Если вы хотите создать безымянное событие, используйте вместо него nil.

person Remy Lebeau    schedule 14.07.2014
comment
Спасибо за это. Теперь, когда я более осознанно осознал, что PChar немного богаче, чем string, в своей способности различать nil и '', это привело меня к обнаружению большего количества мелких ошибок в Delphi. Например. TSimpleEvent в SyncObjs оборачивает CreateEvent конструктором, принимающим строку в качестве имени. Поэтому невозможно создать безымянное событие. Хуже того, он не проверяет результат вызова API, поэтому, если вы используете TSimpleEvent из заставки входа в систему, вы получите бесполезный экземпляр TSimpleEvent. - person Disillusioned; 14.07.2014
comment
Об ошибке T(Simple)Event уже сообщили в QC, и она все еще существует в XE6: #100175 Недопустимая конструкция SyncObjs.TEvent - person Remy Lebeau; 15.07.2014