Copy2Clippboard

Тема в разделе "WASM.WIN32", создана пользователем calidus, 11 окт 2008.

  1. calidus

    calidus Member

    Публикаций:
    0
    Не пойму в чем дело , есть контрол с Листвью. Цель скопировать все строчки с контрола в буфер временный Clippboard. Ошибка возникает на invoke SendDlgItemMessage,Hwwnd,IDC_LSV1,LB_GETCOUNT,0,0 - говорит что несуществует IDC_LSV1 , хотя все другие операции работают. Вызов идет вот так invoke CopyClippboard,hWnd , швнд верный. Ресурсы в порядке.


    Код (Text):
    1. CopyClippboard PROC Hwwnd:dword
    2.     ; WM_CONTEXTMENU
    3.     LOCAL consolehWnd:HWND  ; Console window handle.
    4.     LOCAL cnt:DWORD     ; Listbox items count.
    5.     LOCAL item[50]:BYTE ; Listbox item contentholder.
    6.     LOCAL gbuf:HGLOBAL  ; Global memory handle.
    7.     LOCAL glock:DWORD   ; Global memory lock.
    8.     ;LOCAL itemlen:DWORD    ; Listbox item length.
    9.     nop
    10. invoke SendDlgItemMessage,Hwwnd,IDC_LSV1,LB_GETCOUNT,0,0
    11.             test eax,eax
    12.             jz failed
    13.             mov cnt,eax
    14.             mov ecx,sizeof item
    15.             mul ecx
    16.             mov ecx,eax
    17.             invoke GlobalAlloc,GMEM_MOVEABLE AND GMEM_DDESHARE,ecx
    18.             mov gbuf,eax
    19.             invoke GlobalLock,gbuf
    20.             mov byte ptr [eax],0  
    21.             mov glock,eax
    22.             push ebx
    23.             xor ebx,ebx
    24.             .while (ebx<cnt)
    25.                 invoke SendDlgItemMessage,Hwwnd,IDC_LSV1,LB_GETTEXT,ebx,addr item
    26.                 inc ebx
    27.                 .continue .if !eax ; Move to next if failed.
    28.                 invoke lstrcat,glock,addr item ; Copy item.
    29.                 invoke lstrlen, glock  
    30.                 mov ecx,[glock]
    31.                 mov byte ptr [eax+ecx+0],0dh
    32.                 mov byte ptr [eax+ecx+1],0ah
    33.                 mov byte ptr [eax+ecx+2],00h
    34.             .endw
    35.             invoke GlobalUnlock,gbuf
    36.             pop ebx
    37.             invoke OpenClipboard,Hwwnd
    38.             test eax,eax
    39.             jz clip_failed
    40.             invoke EmptyClipboard
    41.             invoke GlobalLock,gbuf
    42.             mov glock,eax
    43.             invoke SetClipboardData,CF_TEXT,eax
    44.             invoke CloseClipboard
    45. clip_failed:
    46.             invoke GlobalUnlock,gbuf
    47.             invoke GlobalFree,gbuf
    48.    
    49. failed:
    50.         pop ebx
    51.         ret
    52. CopyClippboard ENDP
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    calidus
    есть контрол с Листвью ...LB_GETCOUNT
    LVM_GETITEMCOUNT?
     
  3. calidus

    calidus Member

    Публикаций:
    0
    =) млин точно , это для листбокса .. Спсб) пора спать идти
     
  4. calidus

    calidus Member

    Публикаций:
    0
    =) вообщем вроде исправил , но всеравно что то не то.

    Код (Text):
    1. CopyClippboard PROC Hwwnd:dword
    2.     ; WM_CONTEXTMENU
    3.     LOCAL consolehWnd:HWND  ; Console window handle.
    4.     LOCAL cnt:DWORD     ; Listbox items count.
    5.     LOCAL item[50]:BYTE ; Listbox item contentholder.
    6.     LOCAL gbuf:HGLOBAL  ; Global memory handle.
    7.     LOCAL glock:DWORD   ; Global memory lock.
    8.     ;LOCAL itemlen:DWORD    ; Listbox item length.
    9.     nop
    10. invoke SendDlgItemMessage,Hwwnd,IDC_LSV1,LVM_GETITEMCOUNT,0,0
    11.             test eax,eax
    12.             jz failed
    13.             mov cnt,eax
    14.             mov ecx,sizeof item
    15.             mul ecx ; Get total number of bytes to allocate.
    16.             mov ecx,eax
    17.             invoke GlobalAlloc,GMEM_MOVEABLE AND GMEM_DDESHARE,ecx ; I also tried GMEM_FIXED.
    18.             mov gbuf,eax
    19.             invoke GlobalLock,gbuf
    20.             mov byte ptr [eax],0   ;<--- this must be done outside of loop
    21.             mov glock,eax
    22.             push ebx
    23.             xor ebx,ebx
    24.             .while (ebx<cnt)
    25.                 invoke SendDlgItemMessage,Hwwnd,IDC_LSV1,LVM_GETITEMTEXT,ebx,addr item
    26.                 inc ebx
    27.                 .continue .if !eax ; Move to next if failed.
    28.                 invoke lstrcat,glock,addr item ; Copy item.
    29.                 invoke lstrlen, glock   ;<--- added
    30.                 mov ecx,[glock]
    31.                 mov byte ptr [eax+ecx+0],0dh
    32.                 mov byte ptr [eax+ecx+1],0ah
    33.                 mov byte ptr [eax+ecx+2],00h
    34.             .endw
    35.             invoke GlobalUnlock,gbuf
    36.             pop ebx
    37.             invoke OpenClipboard,Hwwnd
    38.             test eax,eax
    39.             jz clip_failed
    40.             invoke EmptyClipboard
    41.             invoke GlobalLock,gbuf
    42.             mov glock,eax
    43.             invoke SetClipboardData,CF_TEXT,eax
    44.             invoke CloseClipboard
    45. clip_failed:
    46.             invoke GlobalUnlock,gbuf
    47.             invoke GlobalFree,gbuf
    48.    
    49. failed:
    50.         pop ebx
    51.         ret
    52. CopyClippboard ENDP
    вот тут
    Код (Text):
    1.  .while (ebx<cnt)
    2.                 invoke SendDlgItemMessage,Hwwnd,IDC_LSV1,LVM_GETITEMTEXT,ebx,addr item
    вернуло недостаточно памяти ошибка 00000008 , и да наверное стоит сказать что Hwwnd это хэндл дочернего окна и сам процес идет в дочернем окне.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    calidus
    Код (Text):
    1.                                         invoke GlobalLock,gbuf
    2.             mov glock,eax
    3.             invoke SetClipboardData,CF_TEXT,eax        
    4.                                         invoke CloseClipboard
    5. clip_failed:
    6.             invoke GlobalUnlock,gbuf
    7.             invoke GlobalFree,gbuf
    Ты где такому научился ?! По-первых, данные в клипборд положено передавать после Unlock - иначе смысла нет вообще moveable использовать (хотя хрюша и фиксед проглатывает, и HeapAlloc). Но главное - удалять выделенный блок нельзя, винда сама его удалит при следующем вызове OpenClipboard (явном или неявном при копировании\вставке в эдиты). Иначе винда сунется удалять блок, а он уже тю-тю - на первый раз может и простит, но может и послать куда подальше "отправлять отчет в Майкрософт" :lol:
     
  6. calidus

    calidus Member

    Публикаций:
    0
    =) окей попробую ..
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    calidus
    у Петцольда есть пример работы с клипбордом