· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› СТРОКИ

. 1 . 2 . >>

Посл.отвђт Сообщен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" ? ;)

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.141