Code (Text): invoke CountClipboardFormats mov [clFormats], eax invoke OpenClipboard, 0 xor eax, eax mov [clFormat], eax @@: invoke EnumClipboardFormats, [clFormat] mov [clFormat], eax invoke GetClipboardFormatName, eax, str_text_out, 50 ... sub [clFormats], 1 jnz @b invoke CloseClipboard clFormats dd 0 clFormat dd 0 str_text_out db 50 dup (0) после вызова GetClipboardFormatName Olly показывает ERROR_INVALID_PARAMETER (00000057). где ошибка?
проверяй возвращаемые значения других ф-ций и что и куда заносится, т.к. с виду все нормально. (проверил код - у меня все отлично работает)
t00x Olly показывает ERROR_INVALID_PARAMETER Обращать внимание на это имеет смысл только если GetClipboardFormatName вернула ноль.
так и есть. ошибка была в том, что копировал из fasmw. после этого количество форматов присутствует, а имён форматов нет. ;( и ещё, форматы для текста, скопированого при написании этого поста: Code (Text): DataObject text/html HTML Format text/_moz_htmlcontext text/_moz_htmlinfo text/_moz_htmlinfo text/_moz_htmlinfo Ole Private Data Ole Private Data Ole Private Data почему некоторые одинаковые? P.S. разобрался немного
t00x sub [clFormats], 1 Afaik во время перебора модифицировать эту переменную _нельзя_. Ты нарушаешь внутренний порядок enum'а. Из описания GetClipboardFormatName "Parameters format ... For subsequent calls during an enumeration, set format to the result of the previous EnumClipboardFormats call." + не помещает добавить проверку результата работы EnumClipboardFormats Code (Text): ... invoke EnumClipboardFormats, [clFormat] ;; !!! or eax,eax jnz short @1 invoke GetLastError cmp eax,ERROR_SUCCESS jz no_more jmp EnumClipboardFormats_failed @1: ;; !!! mov [clFormat], eax invoke GetClipboardFormatName, eax, str_text_out, 50 ...
clFormats это счётчик цикла . не выводит названия форматов, потому что насколько понял не все форматы имеют название. когда какое-нибудь приложение вводит свой формат данных для буфера обмена, оно: 1. может поменять или добавить название существующего формата; 2. новый введённый формат называет.
t00x clFormats это счётчик цикла . Ну-ну Code (Text): ... clFormat = 0; do { clFormat = EnumClipboardFormats(clFormat); // тут "счетчик цикла" меняется на неизвестно что ... clFormat--; // тут ты _еще_ меняешь его сам } while (clFormat != 0); ... Имеешь полное право организовывать любые циклы. Однако если хочешь корректной работы от EnumClipboardFormats, то учитывай ее требование, повторю его: "set format to the result of the previous EnumClipboardFormats call"? не выводит названия форматов Код после GetClipboardFormatName не показан, поэтому без комментариев.
q_q 1. после вызова EnumClipboardFormats() вызывать GetClipboardFormatName() нельзя для стандартных (описаных в winuser.h), а можно для типов, регистрируемых или именованых какой-либо программой. потому, что если вызвать GetClipboardFormatName() для стандартного типа, размер возвращаемой строки будет равен нулю, т.е. эти типы не имеют строкового представления в операционной системе. 2. по коду, описание переменных см. пост #1 (внизу).
t00x 1. ... 2. ... Ты о чем? Я о том, что в твоем коде #1 неправильно (с точки зрения передаваемого параметра) организован вызов EnumClipboardFormats и отсутствует анализ возвращаемого ею значения, что может являться причиной твоего "почему некоторые одинаковые?". если вызвать GetClipboardFormatName() для стандартного типа, размер возвращаемой строки будет равен нулю Я и не утверждал обратного. Ты же не указал, что смотришь на GetLastError только в том случае если GetClipboardFormatName вернула ноль. Глянул свой старый код, после возврата этой функцией нуля я сравниваю clFormat с CF_TEXT, CF_BITMAP, CF_METAFILEPICT, CF_SYLK, CF_DIF, CF_TIFF, CF_OEMTEXT, CF_DIB, CF_PALETTE, CF_PENDATA, CF_RIFF, CF_WAVE, CF_UNICODETEXT, CF_ENHMETAFILE, CF_HDROP, CF_LOCALE и CF_DIBV5.
q_q О том, что clFormats является счётчиком цикла. всё там правильно. одинаковые потому, что разные значения EnumClipboardFormats() могут иметь одинаковые названия из GetClipboardFormatName().
t00x clFormats является счётчиком цикла ... всё там правильно Последняя попытка. Согласно документации EnumClipboardFormats возвращает ноль, если вызов завершился неудачно или enum'ерация закончилась. Твой код #1 передаст этот ноль в GetClipboardFormatName что будет дальше ты не показал, только в конце "правильного цикла" из нуля будет вычтена единица, "счетчик цикла" станет равным минус единице и "цикл" получит продолжение. Завершится твой цикл получением CF_TEXT (clFormat == 1), что не может являться корректным условием его завершения. разные значения EnumClipboardFormats() могут иметь одинаковые названия из GetClipboardFormatName() Спорное утверждение. Afaik нестандартные форматы регистрируются по имени. Из описания RegisterClipboardFormat "If a registered format with the specified name already exists, a new format is not registered and the return value identifies the existing format", т.е. для одинаковых имен одинаковый идентификатор.
q_q clFormat и clFormats разные переменные. clFormats хранит количество форматов. clFormat содержит формат данных. в листинге вместо "..." вывод на экран. пустая строка не выводится.