ошибка GetClipboardFormatName

Тема в разделе "WASM.WIN32", создана пользователем t00x, 9 ноя 2007.

  1. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Код (Text):
    1.         invoke CountClipboardFormats
    2.         mov [clFormats], eax
    3.  
    4.         invoke OpenClipboard, 0
    5.         xor eax, eax
    6.         mov [clFormat], eax
    7. @@:
    8.         invoke EnumClipboardFormats, [clFormat]
    9.         mov [clFormat], eax
    10.         invoke GetClipboardFormatName, eax, str_text_out, 50
    11.         ...
    12.         sub [clFormats], 1
    13.         jnz @b
    14.  
    15.         invoke CloseClipboard
    16.  
    17. clFormats dd 0
    18. clFormat dd 0
    19. str_text_out db 50 dup (0)
    после вызова GetClipboardFormatName
    Olly показывает ERROR_INVALID_PARAMETER (00000057).
    где ошибка?
     
  2. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    проверяй возвращаемые значения других ф-ций и что и куда заносится, т.к. с виду все нормально.
    (проверил код - у меня все отлично работает)
     
  3. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    проверил, без Olly работает. o_O
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    t00x
    Olly показывает ERROR_INVALID_PARAMETER
    Обращать внимание на это имеет смысл только если GetClipboardFormatName вернула ноль.
     
  5. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    так и есть.
    ошибка была в том, что копировал из fasmw. после этого количество форматов присутствует, а имён форматов нет. ;(

    и ещё, форматы для текста, скопированого при написании этого поста:
    Код (Text):
    1. DataObject
    2. text/html
    3. HTML Format
    4. text/_moz_htmlcontext
    5. text/_moz_htmlinfo
    6. text/_moz_htmlinfo
    7. text/_moz_htmlinfo
    8. Ole Private Data
    9. Ole Private Data
    10. Ole Private Data
    почему некоторые одинаковые?

    P.S. разобрался немного
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    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
    Код (Text):
    1. ...
    2.         invoke EnumClipboardFormats, [clFormat]
    3. ;; !!!
    4.         or eax,eax
    5.         jnz short @1
    6.         invoke GetLastError
    7.         cmp eax,ERROR_SUCCESS
    8.         jz no_more
    9.         jmp EnumClipboardFormats_failed
    10. @1:
    11. ;; !!!
    12.         mov [clFormat], eax
    13.         invoke GetClipboardFormatName, eax, str_text_out, 50
    14. ...
     
  7. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    clFormats это счётчик цикла ;).
    не выводит названия форматов, потому что насколько понял не все форматы имеют название.
    когда какое-нибудь приложение вводит свой формат данных для буфера обмена, оно:
    1. может поменять или добавить название существующего формата;
    2. новый введённый формат называет.
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    t00x
    clFormats это счётчик цикла ;).
    Ну-ну
    Код (Text):
    1. ...
    2. clFormat = 0;
    3. do
    4. {
    5.   clFormat = EnumClipboardFormats(clFormat); // тут "счетчик цикла" меняется на неизвестно что
    6. ...
    7.   clFormat--;                                // тут ты _еще_ меняешь его сам
    8. }
    9. while (clFormat != 0);
    10. ...
    Имеешь полное право организовывать любые циклы. Однако если хочешь корректной работы от EnumClipboardFormats, то учитывай ее требование, повторю его: "set format to the result of the previous EnumClipboardFormats call"?

    не выводит названия форматов
    Код после GetClipboardFormatName не показан, поэтому без комментариев.
     
  9. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    q_q
    1. после вызова EnumClipboardFormats() вызывать GetClipboardFormatName() нельзя для стандартных (описаных в winuser.h), а можно для типов, регистрируемых или именованых какой-либо программой. потому, что если вызвать GetClipboardFormatName() для стандартного типа, размер возвращаемой строки будет равен нулю, т.е. эти типы не имеют строкового представления в операционной системе.
    2. по коду, описание переменных см. пост #1 (внизу).
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    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.
     
  11. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    q_q
    О том, что clFormats является счётчиком цикла.
    всё там правильно. одинаковые потому, что разные значения EnumClipboardFormats() могут иметь одинаковые названия из GetClipboardFormatName().
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    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", т.е. для одинаковых имен одинаковый идентификатор.
     
  13. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    q_q
    clFormat и clFormats разные переменные.
    clFormats хранит количество форматов.
    clFormat содержит формат данных.
    в листинге вместо "..." вывод на экран. пустая строка не выводится.
     
  14. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    t00x
    clFormat и clFormats разные переменные.
    Теперь я увидел.