|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Янв 15, 2004 11:59:25 в фрагменте пробую пихать данные в строку и переслать ее в клипбоард ну есть проблема строка оказывается пустой!!!! Где грабли???? invoke GlobalLock,hMemm mov pMemm,eax ; покажем что у нас в Клипбоарде ;============================== mov EBX,EAX invoke lstrlen,pMemm mov ECX, EAX L1: mov AL,BYTE PTR [pMemm[ECX]] call TRANS_ dec ecx cmp ecx,0 jne L1 mov [byte ptr STR_[1]],'#' ;============================== invoke MessageBox, hWnd,pMemm,0,0 invoke Copy2CB ,pMemm,hWnd |
|
|
Дата: Янв 15, 2004 12:09:28 Грабли скорее всего в том что ты не умеешь работать с клипбордом :-) По такому малому куску кода трудно сказать почему у тя строка пустая :-) p.s. Используй тег code когда постишь код [code][/code] |
|
|
Дата: Янв 15, 2004 12:10:19 · Поправил: Asterix |
|
|
Дата: Янв 15, 2004 12:15:15 Ну вот кода побольше!!!!!
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib
WM_SHELLNOTIFY equ WM_USER+5
IDI_TRAY equ 0
IDM_RESTORE equ 1000
IDM_EXIT equ 1010
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
ClassName db "TrayIconWinClass",0
AppName db "ICQ Translater",0
RestoreString db "&Translate Ctrl+F12",0
ExitString db "E&xit Program",0
.data?
hInstance dd ?
note NOTIFYICONDATA <>
hPopupMenu dd ?
STR_ db 2000 DUP (?)
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_APPWORKSPACE
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_V ISIBLE,CW_USEDEFAULT,\
CW_USEDEFAULT,350,200,NULL,NULL,\
hInst,NULL
mov hwnd,eax
invoke RegisterHotKey,hwnd,4155,MOD_CONTROL,123 ;Register HOTKEY Ctrl+F12
.while TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endw
mov eax,msg.wParam
ret
WinMain endp
Copy2CB proc pszStr:DWORD,hWnd:HWND
LOCAL dwStrLen:DWORD
LOCAL hMemm:DWORD
LOCAL pMemm:DWORD
invoke lstrlen,pszStr ; посчитаем длину нашей строки
mov dwStrLen,eax
inc dwStrLen ; нужно учесть завершающий ноль... кажется нужно :)
invoke GlobalAlloc,GMEM_MOVEABLE,dwStrLen ; выделим память
mov hMemm,eax
invoke GlobalLock,hMemm ; заблокируем и получим на нее указатель
mov pMemm,eax
invoke lstrcpy,pMemm,pszStr ; скопируем в эту память нашу строку
invoke GlobalUnlock,hMemm ; разблокируем нашу память
invoke OpenClipboard,hWnd ; откроем Клипбоард
invoke EmptyClipboard ; почистим его
invoke SetClipboardData,CF_TEXT,hMemm ; установим нашу строку
invoke CloseClipboard ; закроем Клипбоард
invoke GlobalFree,hMemm ; освободим память, любезно
; предоставленную нам Windows :)
ret
Copy2CB endp
;==================
TRANS_ proc
.IF AL==' '
MOV BYTE PTR [STR_[ECX]],' '
.ELSEIF AL=='-'
MOV BYTE PTR [STR_[ECX]],'-'
.ELSEIF AL=='А'
MOV BYTE PTR [STR_[ECX]],'A'
.ELSEIF AL=='а'
MOV BYTE PTR [STR_[ECX]],'а'
.ELSEIF AL=='Б'
MOV BYTE PTR [STR_[ECX]],'B'
.ELSEIF AL=='б'
MOV BYTE PTR [STR_[ECX]],'b'
.ELSEIF AL=='В'
MOV BYTE PTR [STR_[ECX]],'V'
.ELSEIF AL=='в'
MOV BYTE PTR [STR_[ECX]],'v'
.ELSEIF AL=='Г'
MOV BYTE PTR [STR_[ECX]],'G'
.ELSEIF AL=='г'
MOV BYTE PTR [STR_[ECX]],'g'
.ELSEIF AL=='Д'
MOV BYTE PTR [STR_[ECX]],'D'
.ELSEIF AL=='д'
MOV BYTE PTR [STR_[ECX]],'d'
.ELSEIF AL=='Е'
MOV BYTE PTR [STR_[ECX]],'E'
.ELSEIF AL=='е'
MOV BYTE PTR [STR_[ECX]],'e'
.ELSE
MOV BYTE PTR [STR_[ECX]],AL
.ENDIF
RET
TRANS_ ENDP
;==================
ShowCB proc hWnd:HWND
LOCAL hMemm:DWORD
LOCAL pMemm:DWORD
invoke OpenClipboard, hWnd
invoke GetClipboardData,CF_TEXT
mov hMemm,eax
invoke CloseClipboard
.if hMemm!=0
invoke GlobalLock,hMemm
mov pMemm,eax ; покажем что у нас в Клипбоарде
;==============================
mov EBX,EAX
invoke lstrlen,pMemm
mov ECX, EAX
L1:
mov AL,BYTE PTR [pMemm[ECX]]
call TRANS_
dec ecx
cmp ecx,0
jne L1
mov [byte ptr STR_[1]],'#'
;==============================
invoke MessageBox, hWnd,pMemm,0,0
invoke Copy2CB ,pMemm,hWnd
invoke GlobalUnlock, hMemm
.endif
ret
ShowCB endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL pt:POINT
LOCAL rect:RECT
LOCAL DC:HWND ;ДИСКРИПТОР ОКНА
LOCAL EditDC: HWND ;ДИСКРИПТОР ЕДИТА
.IF uMsg==WM_HOTKEY
invoke GetForegroundWindow ;ВЗЯТЬ ХЕНДЛ АКТИВНОГО ОКНА
MOV DC, EAX ;СОХРАНИТЬ ЕГО В DC
.IF DC!=NULL
invoke GetWindow ,DC ,5 ;ВЗЯТЬ ХЕНДЛ ДОЧЕРНЕГО gw_Child=5 ОКНА
MOV EditDC,EAX ;СОХРАНИТЬ ЕГО В EditDC
invoke SendMessage ,EditDC ,WM_COPY,0,0 ;СКОПИРОВАТЬ
invoke ShowCB ,DC
;invoke Copy2CB ,S,DC
invoke SendMessage ,EditDC ,WM_PASTE ,0 ,0 ;ВСТАВИТЬ ДАННЫЕ ИЗ БУФЕРА В ЕДИТ
.ENDIF
.ENDIF
.if uMsg==WM_CREATE
invoke CreatePopupMenu
mov hPopupMenu,eax
invoke AppendMenu,hPopupMenu,MF_STRING,IDM_RESTORE,addr RestoreString
invoke AppendMenu,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString
.elseif uMsg==WM_DESTROY
invoke DestroyMenu,hPopupMenu
invoke PostQuitMessage,NULL
.elseif uMsg==WM_SIZE
.if wParam==SIZE_MINIMIZED
mov note.cbSize,sizeof NOTIFYICONDATA
push hWnd
pop note.hwnd
mov note.uID,IDI_TRAY
mov note.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP
mov note.uCallbackMessage,WM_SHELLNOTIFY
invoke LoadIcon,NULL,IDI_WINLOGO
mov note.hIcon,eax
invoke lstrcpy,addr note.szTip,addr AppName
invoke ShowWindow,hWnd,SW_HIDE
invoke Shell_NotifyIcon,NIM_ADD,addr note
.endif
.elseif uMsg==WM_COMMAND
.if lParam==0
invoke Shell_NotifyIcon,NIM_DELETE,addr note
mov eax,wParam
.if ax==IDM_RESTORE
invoke ShowWindow,hWnd,SW_RESTORE
.else
invoke DestroyWindow,hWnd
.endif
.endif
.elseif uMsg==WM_SHELLNOTIFY
.if wParam==IDI_TRAY
.if lParam==WM_RBUTTONDOWN
invoke GetCursorPos,addr pt
invoke SetForegroundWindow,hWnd
invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN or TPM_RIGHTBUTTON,pt.x,pt.y,NULL,hWnd,NULL
invoke PostMessage,hWnd,WM_NULL,0,0
.elseif lParam==WM_LBUTTONDBLCLK
invoke SendMessage,hWnd,WM_COMMAND,IDM_RESTORE,0
.endif
.endif
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
end start
|
|
|
Дата: Янв 15, 2004 12:35:15 Почему ты не проверяешь как отработали API в твоём коде, вот примерчик: GetClipboardText proc
LOCAL hClipMemory:HANDLE
LOCAL ClipMemorySize:DWORD
LOCAL pMyCopy:DWORD
LOCAL pClipMemory:DWORD
LOCAL fDoPaste:BOOL
and fDoPaste, FALSE ;обнуляем локальную переменную fDoPaste
invoke IsClipboardFormatAvailable,CF_TEXT ;проверяем, действительно ли в буфере обмена содержится текст
.if eax != 0
invoke OpenClipboard,NULL ;открываем буфер обмена
.if eax != 0
invoke GetClipboardData,CF_TEXT ;получаем описатель области памяти, содержащей текст
.if eax != NULL
mov hClipMemory,eax
invoke GlobalSize,hClipMemory ;получить размер области памяти, содержащей текст
.if eax != 0
mov ClipMemorySize,eax
invoke GetProcessHeap
.if eax != NULL
invoke HeapAlloc,eax,HEAP_ZERO_MEMORY,ClipMemorySize ;выделить область памяти такого же размера
.if eax != NULL
mov pMyCopy,eax
invoke GlobalLock,hClipMemory ;зафиксировать описатель области памяти для получения указателя на неё
.if eax != NULL
mov pClipMemory,eax
invoke lstrcpy,pMyCopy,pClipMemory ;копируем данные
.if eax != 0
inc fDoPaste ;устанавливаем fDoPaste == TRUE
.endif
invoke GlobalUnlock,hClipMemory ;снять фиксацию памяти
invoke CloseClipboard ;закрыть буфер обмена
.if fDoPaste == TRUE
mov eax,pMyCopy ;сохранить указатель в eax
ret
.endif
xor eax,eax
ret
.endif
.endif
.endif
.endif
.endif
invoke CloseClipboard
xor eax,eax
.endif
.endif
ret
GetClipboardText endp |
|
|
Дата: Янв 15, 2004 12:42:55 Gromozeka У меня твой код показывает MsgBox с содержимым буфера обмена. Только иногда приложение вываливается из-за ошибки. Ты уверен, что нажатие Ctrl+F12 произойдет, когда будет активно приложение с edit-ребенком? ps зачем городить такую большую программу? imho для изучения работы с буфером обмена достаточно пары консольных зубочисток, одна чтение из, а другая запись в. |
|
|
Дата: Янв 15, 2004 12:48:59 Затем, что это курсовая работа, создание программы транслитератора для ICQ, а в MASM'e никто не разбираеться |
|
|
Дата: Янв 15, 2004 13:00:39 [ q_q: imho для изучения работы с буфером обмена достаточно пары консольных зубочисток, одна чтение из, а другая запись в.] Зачем две, достаточно и одной ;-), читаем текст меняем что-нибудь в нём и обратно записываем в клипборд. |
|
|
Дата: Янв 15, 2004 13:04:13 Gromozeka Пытаешься объять необъятное? В смысле применяй правило Ю.Цезаря - разделяй и властвуй. Asterix 2 в 1. Опять большая программа. |
|
|
Дата: Янв 15, 2004 13:16:58 Пытаюсь выжить в неравном бою с преподавателями, но не сильно получаеться,а помощи от преподователя не дождешься. Вот и получаеться один большой необъятный глюк. :)) |
|
|
Дата: Янв 15, 2004 13:19:16 Asterix P.S МАТЬ МОЯ РОДНАЯ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Ничего себе отступы :))) |
|
|
Дата: Янв 15, 2004 15:00:38 Edmond Выглядит, конечно, объемно. Но работает такой код быстрее, чем прыжок на Exit после каждой проверки. Сказывается условный переход вниз по коду, который, как неверно предсказанный, приводит к сбросу предвыборки команд. Хотя, при использовании API, это скорее не актуально. |
|
|
Дата: Янв 15, 2004 15:21:23 sd2000 То есть?
test eax,eax
jz --> exit
Хуже чем
test eax,eax
jnz --> code
jmp --> exit
? |
|
|
Дата: Янв 15, 2004 15:49:58 Edmond неужели ты (такой большой :) не знаешь что такое static branch prediction ? |
|
|
Дата: Янв 15, 2004 16:02:55 Asterix .if eax != 0 - а зачем здесь лишние символы "!= 0" ? ;) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.141 |