Наисал пример в Win98 все работает а вот в XP SP1 через раз SetClipboardData вовращает 0 в чем может быть причина? Смысл проги читает имена разделов из win.ini, после выбора имени помещает все ключи и их значения в буфер обмена и вставляет их в основное окно. пример прилагается компилятор FASMW 923826693__key.rar
У меня w2k, но попробуй заменить: "invoke OpenClipboard,[edithwnd]" на "invoke OpenClipboard,[hwnd_main]"
А ещё лучше просто "invoke OpenClipboard,0" , если нет, то "EmptyClipboard" перемести до "GlobalUnlock"
Спасибо за помощь. invoke OpenClipboard,0 решает эту проблему. Одно мне не понятно почему при указании конкретного дескриптора [edithwnd]или [hwnd_main]Getlasteror возвращал ошибку неверный дескриптор сточностью через раз хотя в отладчеке все значения адресов и дескрипторов едиинтичны в обоих случаях.
<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): OpenClipboard EmptyClipboard GlobalAlloc GlobalLock GlobalUnlock SetClipboardData CloseClipboard
Примерно можно так (с копированием русского текста, или кодировкой по-умолчанию если убрать 0149h) : Код (Text): ;================================================================== 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 ;==================================================================
Вобще-то нужно проверки после функций вставлять, иначе может косяк получится. Про работу с буфером обмена можно прочитать у Петцольда(надеюсь фамилию не очень переврал).
нашёл я наконец где собака зарыта. После вызова SetClipboardData данный дескриптор считается недиствительным а блок памяти принадлежит Windows а я его пытался освобождать его с GlobalFree.