Не пойму в чем дело , есть контрол с Листвью. Цель скопировать все строчки с контрола в буфер временный Clippboard. Ошибка возникает на invoke SendDlgItemMessage,Hwwnd,IDC_LSV1,LB_GETCOUNT,0,0 - говорит что несуществует IDC_LSV1 , хотя все другие операции работают. Вызов идет вот так invoke CopyClippboard,hWnd , швнд верный. Ресурсы в порядке. Code (Text): CopyClippboard PROC Hwwnd:dword ; WM_CONTEXTMENU LOCAL consolehWnd:HWND ; Console window handle. LOCAL cnt:DWORD ; Listbox items count. LOCAL item[50]:BYTE ; Listbox item contentholder. LOCAL gbuf:HGLOBAL ; Global memory handle. LOCAL glock:DWORD ; Global memory lock. ;LOCAL itemlen:DWORD ; Listbox item length. nop invoke SendDlgItemMessage,Hwwnd,IDC_LSV1,LB_GETCOUNT,0,0 test eax,eax jz failed mov cnt,eax mov ecx,sizeof item mul ecx mov ecx,eax invoke GlobalAlloc,GMEM_MOVEABLE AND GMEM_DDESHARE,ecx mov gbuf,eax invoke GlobalLock,gbuf mov byte ptr [eax],0 mov glock,eax push ebx xor ebx,ebx .while (ebx<cnt) invoke SendDlgItemMessage,Hwwnd,IDC_LSV1,LB_GETTEXT,ebx,addr item inc ebx .continue .if !eax ; Move to next if failed. invoke lstrcat,glock,addr item ; Copy item. invoke lstrlen, glock mov ecx,[glock] mov byte ptr [eax+ecx+0],0dh mov byte ptr [eax+ecx+1],0ah mov byte ptr [eax+ecx+2],00h .endw invoke GlobalUnlock,gbuf pop ebx invoke OpenClipboard,Hwwnd test eax,eax jz clip_failed invoke EmptyClipboard invoke GlobalLock,gbuf mov glock,eax invoke SetClipboardData,CF_TEXT,eax invoke CloseClipboard clip_failed: invoke GlobalUnlock,gbuf invoke GlobalFree,gbuf failed: pop ebx ret CopyClippboard ENDP
=) вообщем вроде исправил , но всеравно что то не то. Code (Text): CopyClippboard PROC Hwwnd:dword ; WM_CONTEXTMENU LOCAL consolehWnd:HWND ; Console window handle. LOCAL cnt:DWORD ; Listbox items count. LOCAL item[50]:BYTE ; Listbox item contentholder. LOCAL gbuf:HGLOBAL ; Global memory handle. LOCAL glock:DWORD ; Global memory lock. ;LOCAL itemlen:DWORD ; Listbox item length. nop invoke SendDlgItemMessage,Hwwnd,IDC_LSV1,LVM_GETITEMCOUNT,0,0 test eax,eax jz failed mov cnt,eax mov ecx,sizeof item mul ecx ; Get total number of bytes to allocate. mov ecx,eax invoke GlobalAlloc,GMEM_MOVEABLE AND GMEM_DDESHARE,ecx ; I also tried GMEM_FIXED. mov gbuf,eax invoke GlobalLock,gbuf mov byte ptr [eax],0 ;<--- this must be done outside of loop mov glock,eax push ebx xor ebx,ebx .while (ebx<cnt) invoke SendDlgItemMessage,Hwwnd,IDC_LSV1,LVM_GETITEMTEXT,ebx,addr item inc ebx .continue .if !eax ; Move to next if failed. invoke lstrcat,glock,addr item ; Copy item. invoke lstrlen, glock ;<--- added mov ecx,[glock] mov byte ptr [eax+ecx+0],0dh mov byte ptr [eax+ecx+1],0ah mov byte ptr [eax+ecx+2],00h .endw invoke GlobalUnlock,gbuf pop ebx invoke OpenClipboard,Hwwnd test eax,eax jz clip_failed invoke EmptyClipboard invoke GlobalLock,gbuf mov glock,eax invoke SetClipboardData,CF_TEXT,eax invoke CloseClipboard clip_failed: invoke GlobalUnlock,gbuf invoke GlobalFree,gbuf failed: pop ebx ret CopyClippboard ENDP вот тут Code (Text): .while (ebx<cnt) invoke SendDlgItemMessage,Hwwnd,IDC_LSV1,LVM_GETITEMTEXT,ebx,addr item вернуло недостаточно памяти ошибка 00000008 , и да наверное стоит сказать что Hwwnd это хэндл дочернего окна и сам процес идет в дочернем окне.
calidus Code (Text): invoke GlobalLock,gbuf mov glock,eax invoke SetClipboardData,CF_TEXT,eax invoke CloseClipboard clip_failed: invoke GlobalUnlock,gbuf invoke GlobalFree,gbuf Ты где такому научился ?! По-первых, данные в клипборд положено передавать после Unlock - иначе смысла нет вообще moveable использовать (хотя хрюша и фиксед проглатывает, и HeapAlloc). Но главное - удалять выделенный блок нельзя, винда сама его удалит при следующем вызове OpenClipboard (явном или неявном при копировании\вставке в эдиты). Иначе винда сунется удалять блок, а он уже тю-тю - на первый раз может и простит, но может и послать куда подальше "отправлять отчет в Майкрософт"