|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Ноя 2, 2004 13:07:47 Наисал пример в Win98 все работает а вот в XP SP1 через раз SetClipboardData вовращает 0 в чем может быть причина? Смысл проги читает имена разделов из win.ini, после выбора имени помещает все ключи и их значения в буфер обмена и вставляет их в основное окно. пример прилагается компилятор FASMW 923826693__key.rar |
|
|
Дата: Ноя 2, 2004 14:34:58 У меня w2k, но попробуй заменить: "invoke OpenClipboard,[edithwnd]" на "invoke OpenClipboard,[hwnd_main]" |
|
|
Дата: Ноя 2, 2004 14:48:38 А ещё лучше просто "invoke OpenClipboard,0" , если нет, то "EmptyClipboard" перемести до "GlobalUnlock" |
|
|
Дата: Ноя 2, 2004 15:13:31 Спасибо за помощь. invoke OpenClipboard,0 решает эту проблему. Одно мне не понятно почему при указании конкретного дескриптора [edithwnd]или [hwnd_main]Getlasteror возвращал ошибку неверный дескриптор сточностью через раз хотя в отладчеке все значения адресов и дескрипторов едиинтичны в обоих случаях. |
|
|
Дата: Ноя 2, 2004 16:24:18 · Поправил: bogrus 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. Короче тут получается, что EmptyClipboard уходит в ядро, которое через раз возвращает управление то в твой код, то в ntdll.KiUserCallbackDispatcher, после которого в kernel32.dll идет проверка на валидность выделенных участков памяти, она не проходит и твой кусок затирает ntdll.RtlFreeHandle. Видимо стоит придерживатся такой последовательности ф-ций: OpenClipboard EmptyClipboard GlobalAlloc GlobalLock GlobalUnlock SetClipboardData CloseClipboard |
|
|
Дата: Ноя 2, 2004 16:56:43 Примерно можно так (с копированием русского текста, или кодировкой по-умолчанию если убрать 0149h) : ;==================================================================
buffer db 'тест буфера обмена',0
sbuffer = $-buffer
;==================================================================
start: invoke OpenClipboard,0
invoke EmptyClipboard
invoke GlobalAlloc,GMEM_MOVEABLE+GMEM_DDESHARE,4
mov esi,eax
invoke GlobalLock,esi
mov dword [eax],0149h
invoke GlobalUnlock,esi
invoke SetClipboardData,CF_LOCALE,esi
invoke GlobalAlloc,GMEM_MOVEABLE+GMEM_DDESHARE,sbuffer
mov esi,eax
invoke GlobalLock,esi
invoke lstrcpy,eax,buffer
invoke GlobalUnlock,esi
invoke SetClipboardData,CF_TEXT,esi
invoke CloseClipboard
;================================================================== |
|
|
Дата: Ноя 2, 2004 18:49:15 Вобще-то нужно проверки после функций вставлять, иначе может косяк получится. Про работу с буфером обмена можно прочитать у Петцольда(надеюсь фамилию не очень переврал). |
|
|
Дата: Ноя 3, 2004 08:17:22 нашёл я наконец где собака зарыта. После вызова SetClipboardData данный дескриптор считается недиствительным а блок памяти принадлежит Windows а я его пытался освобождать его с GlobalFree. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.053 |