SetClipboardData через раз

Тема в разделе "WASM.WIN32", создана пользователем aravar, 2 ноя 2004.

  1. aravar

    aravar New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2004
    Сообщения:
    35
    Наисал пример в Win98 все работает а вот в XP SP1 через раз SetClipboardData вовращает 0 в чем может быть причина? Смысл проги читает имена разделов из win.ini, после выбора имени помещает все ключи и их значения в буфер обмена и вставляет их в основное окно.

    пример прилагается

    компилятор FASMW

    [​IMG] 923826693__key.rar
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    У меня w2k, но попробуй заменить: "invoke OpenClipboard,[edithwnd]" на "invoke OpenClipboard,[hwnd_main]"
     
  3. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    А ещё лучше просто "invoke OpenClipboard,0" , если нет, то "EmptyClipboard" перемести до "GlobalUnlock"
     
  4. aravar

    aravar New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2004
    Сообщения:
    35
    Спасибо за помощь. invoke OpenClipboard,0 решает эту проблему. Одно мне не понятно почему при указании конкретного дескриптора [edithwnd]или [hwnd_main]Getlasteror возвращал ошибку неверный дескриптор сточностью через раз хотя в отладчеке все значения адресов и дескрипторов едиинтичны в обоих случаях.
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    <span style="background-color: white]BOOL EmptyClipboard(VOID)



    Before calling EmptyClipboard, an application must open the clipboard by using the OpenClipboard function. If the application specifies a NULL window handle when opening the clipboard, EmptyClipboard succeeds but sets the clipboard owner to NULL.



    After SetClipboardData is called, the system owns the object identified by the hMem parameter. The application can read the data, but must not free the handle or leave it locked until the CloseClipboard function is called. (The application can access the data after calling CloseClipboard). If the hMem parameter identifies a memory object, the object must have been allocated using the function with the GMEM_MOVEABLE flag.</span><!--back-->



    Короче тут получается, что EmptyClipboard уходит в ядро, которое через раз возвращает управление то в твой код, то в ntdll.KiUserCallbackDispatcher, после которого в kernel32.dll идет проверка на валидность выделенных участков памяти, она не проходит и твой кусок затирает ntdll.RtlFreeHandle.



    Видимо стоит придерживатся такой последовательности ф-ций:
    Код (Text):
    1. OpenClipboard
    2. EmptyClipboard
    3. GlobalAlloc
    4. GlobalLock
    5. GlobalUnlock
    6. SetClipboardData
    7. CloseClipboard
     
  6. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Примерно можно так (с копированием русского текста, или кодировкой по-умолчанию если убрать 0149h) :
    Код (Text):
    1. ;==================================================================
    2. buffer      db      'тест буфера обмена',0
    3. sbuffer     =       $-buffer
    4. ;==================================================================
    5. start:      invoke  OpenClipboard,0
    6.             invoke  EmptyClipboard
    7.             invoke  GlobalAlloc,GMEM_MOVEABLE+GMEM_DDESHARE,4
    8.             mov     esi,eax
    9.             invoke  GlobalLock,esi
    10.             mov     dword [eax],0149h
    11.             invoke  GlobalUnlock,esi
    12.             invoke  SetClipboardData,CF_LOCALE,esi
    13.             invoke  GlobalAlloc,GMEM_MOVEABLE+GMEM_DDESHARE,sbuffer
    14.             mov     esi,eax
    15.             invoke  GlobalLock,esi
    16.             invoke  lstrcpy,eax,buffer
    17.             invoke  GlobalUnlock,esi
    18.             invoke  SetClipboardData,CF_TEXT,esi
    19.             invoke  CloseClipboard
    20. ;==================================================================
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Вобще-то нужно проверки после функций вставлять, иначе может косяк получится. Про работу с буфером обмена можно прочитать у Петцольда(надеюсь фамилию не очень переврал).
     
  8. aravar

    aravar New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2004
    Сообщения:
    35
    нашёл я наконец где собака зарыта. После вызова SetClipboardData данный дескриптор считается недиствительным а блок памяти принадлежит Windows а я его пытался освобождать его с GlobalFree.