2011-01-19 9 views
3

У меня есть эта неустойчивая и неустойчивая проблема, которая долгое время меня сводила с ума: в моей программе GetClipboardData (CF_TEXT) достигает 90% (или около того) времени, но время от времени это возвращает NULL.В каких обстоятельствах GetClipboardData (CF_TEXT) возвращает NULL?

Это несмотря на то, что OpenClipboard() всегда успешно (и возвращает значение проверено) перед вызовом GetClipboardData (CF_TEXT).

Обратите внимание, что коэффициент успешности 90% соответствует той же самой точной странице! (То есть я знаю есть содержание CF_TEXT там)

Примечание: Если это не удается, я немедленно вызвать GetLastError(), но все это возвращает это: «Операция успешно завершена».

Код в вопросе так же просто, как:

if (::OpenClipboard(hwndW)) 
{ 
    HANDLE handleClip = ::GetClipboardData(CF_TEXT); 
    if (handleClip == NULL) 
    dw = GetLastError() 
} 

Что может придать неправильный код GetLastError() в это?

Любая идея, что может вызвать такое непоследовательное поведение?

Возможно ли, что какой-либо другой процесс блокирует буфер обмена? Если да, то как мне его вернуть?

Как устранить или отладить что-то вроде этого?

+0

OpenClipboard() ничего не говорит. Что говорит вам EnumClipboardFormats()? –

+1

Как вы знаете, что содержимое по-прежнему находится в буфере обмена? –

+0

@Jeff Это хороший вопрос. Я «знаю», что он есть, потому что, если я попробую снова (точная страница), это будет успешным. Это не очень «научный», но когда GetLastError() возвращает «Операция завершена успешно», что еще я имею в своем наборе инструментов?Я попробую предложение Ганса вызвать EnumClipboardFormats(), но даже если он скажет мне, что CF_TEXT существует (или не существует), он не говорит мне * почему * он настолько противоречив. –

ответ

1

Я выполнил поиск в Google и нашел someone else with a similar problem (прокрутите вниз, чтобы найти конкретный ответ), который оказался из-за повторного входа. Вы называете EmptyClipboard() где угодно, а затем реагируете на изменения? Возможно, у вас проблема повторного входа.

Update после фрагмента кода при условии
В коде вы в курсе, условие неправильно перед вызовом GetLastError. Вы называете это только тогда, когда получаете результат, отличный от NULL, а не когда вы получаете результат NULL. Если вы исправите это, вы должны получить лучший ответ от GetLastError. This MSDN article должен помочь в расшифровке, что на самом деле означает результат GetLastError.

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

+0

@Jeff Извините, что не упомянул об этом, конечно, я назвал GetLastError(). Это то, что он возвращает: ** «Операция завершена успешно» **. Я полностью озадачен этим. –

+0

@ Android Eve: Я изменил свой ответ на основе дополнительной информации. –

+0

@Jeff +1 для этой ссылки. Зная мою программу, я думаю, вы на что-то ... Нет, я не называю EmptyClipboard(), но я вызываю CloseClipboard() - разве это еще не лучше? Кроме того, даже если я забыл вызвать функцию empty/close, почему GetLastError() возвращает «успешно»? –

3

Вы используете WebRoot SecureAnywhere? Функция Identity Shield автоматически опустошает буфер обмена, если не разрешенное приложение (в основном, что не было предварительно одобрено) пытается извлечь текст из буфера обмена, который был помещен в буфер обмена защищенным приложением (включает в себя множество браузеров и почтовых клиентов по умолчанию). Когда это произойдет, GetClipboardData(CF_TEXT) вернет NULL, даже если предыдущий вызов IsClipboardFormatAvailable(CF_TEXT) верен.

+0

Это просто стоило мне дня, пытаясь понять, что случилось с моей программой. Пользователь запускал WebRoot, и это точно соответствовало моей проблеме и решению. –

+0

Мы не могли понять, что очищало часть CF_TEXT в буфере обмена для одного из наших пользователей в нашем программном обеспечении. Это было! Спасибо, что спасли нам кучу времени. –

 Смежные вопросы

  • Нет связанных вопросов^_^