немогу ничего понять Код (Text): invoke WSAAsyncSelect,hSocket2,hWnd, DownLoadButton1ID, FD_ACCEPT+FD_READ написаль всё как в MSDN написано, сами хендлы вместо их указателей послал функции, и всёравно INVALID_SOCKET!
Да, не заметил. Насчет ошибки - не знаю. У меня ошибки WSAAsyncSelect не возвращает: Код (Text): .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\ws2_32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\winmm.lib includelib \masm32\lib\ws2_32.lib .DATA wsa WSADATA <> buffer db MAX_PATH dup(?) hIP dd ? NameIP db MAX_PATH dup(?) buf_out1 db MAX_PATH dup(?) hSocket2 dd ? Port dd 80 sin sockaddr_in <> .CODE start: invoke WSAStartup, 101h, addr wsa invoke gethostname, addr buffer, sizeof buffer invoke gethostbyname, addr buffer ; получаем стpуктуpу HOSTENT ; теперь eax содеpжит указатель на структ. HOSTENT, см. windows.inc mov eax, [eax+12] ; получаем указатель на элемент h_list в HOSTENT mov eax, [eax] ; получаем указатель на указатель на IP mov eax, [eax] ; получаем указатель на строку IP в сетевом порядке байт ; конвертировать IP адрес в строковый формат с точками invoke inet_ntoa, eax ; при выходе в eax - указатель на строку вида 127.0.0.1 mov hIP, eax ; запомнить указатель на строку с IP invoke wsprintf, addr buf_out1, addr NameIP, hIP invoke socket, AF_INET, \ ; Address family (в веp 1.1 доступно только семейство AF_INET) SOCK_STREAM,\ ; задает тип сокета (STREAM или DATAGRAM) 0 ; тип протокола (не устанавливать никакого пpотокола: 0) mov [hSocket2], eax ; запомнить хендл invoke WSAAsyncSelect,hSocket2,000202C2h,1,FD_ACCEPT+FD_READ .if eax==INVALID_SOCKET invoke MessageBox,NULL,NULL,NULL,MB_OK .endif invoke htons, Port mov sin.sin_port, ax mov sin.sin_family, AF_INET mov sin.sin_addr, INADDR_ANY ; ассоциировать локальный адрес (представленный в структуре sin) с сокетом invoke bind, hSocket2, addr sin, sizeof sin invoke listen, hSocket2, 5 ; blabla bla blab la .......................................... end start вместо hWnd я просто воткнул хендл окна тоталкомандера
хм.я кажется знаю де ошибка. у меня структуры wsa и sin описаны в секции описания неинициаоизированных переменных
progect.inc Код (Text): ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ; include files ; ~~~~~~~~~~~~~ include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\gdi32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\Comctl32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc include \masm32\include\oleaut32.inc include \masm32\include\msvcrt.inc include \masm32\macros\macros.asm include \masm32\include\wsock32.inc ; libraries ; ~~~~~~~~~ includelib \masm32\lib\masm32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\Comctl32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\shell32.lib includelib \masm32\lib\oleaut32.lib includelib \masm32\lib\msvcrt.lib includelib \masm32\lib\wsock32.lib ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ;================= ; Local prototypes ;================= WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD TopXY PROTO :DWORD,:DWORD Paint_Proc PROTO :DWORD RegisterWinClass PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD MsgLoop PROTO Main PROTO AutoScale MACRO swidth, sheight invoke GetPercent,sWid,swidth mov Wwd, eax invoke GetPercent,sHgt,sheight mov Wht, eax invoke TopXY,Wwd,sWid mov Wtx, eax invoke TopXY,Wht,sHgt mov Wty, eax ENDM DisplayMenu MACRO handl, IDnum invoke LoadMenu,hInstance,IDnum invoke SetMenu,handl,eax ENDM DisplayWindow MACRO handl, ShowStyle invoke ShowWindow,handl, ShowStyle invoke UpdateWindow,handl ENDM .data MAXSIZE equ 64 szDisplayName db "Project Template",0 ListViewClass db "SysListView32",0 PushButtonClass db "Button",0 DownLoadButton1 db "скачать InetAccess",0 DownLoadButton1ID dd WM_USER+1 DownLoadButton2 db "скачать CommFort",0 DownLoadButton2ID dd WM_USER+2 DownLoadButton3 db "скачать DC++",0 DownLoadButton3ID dd WM_USER+3 DownLoadButton4 db "скачать CS 1.6",0 DownLoadButton4ID dd WM_USER+4 DownLoadButton5 db "скачать WoW 2.4.3",0 DownLoadButton5ID dd WM_USER+5 DownLoadButton6 db "скачать L2 Terra",0 DownLoadButton6ID dd WM_USER+6 DownLoadButton7 db "скачать COD4 Terra",0 DownLoadButton7ID dd WM_USER+7 DownLoadButtonMAIN db "начать закачку",0 DownLoadButtonMAINID dd WM_USER+100 DownLoadButtonLIST db "смотреть список закачек",0 DownLoadButtonLISTID dd WM_USER+101 WM_SOCKET equ WM_USER + 200 AdresIP db "127.0.0.1",0 sin sockaddr_in <> wsa WSADATA <>; структура данных для сети...cм. windows.inc Port dd 3030 buffer db MAXSIZE dup (0) buf_out db MAXSIZE dup (0) ; буфер для имени компьютера buf_out1 db MAXSIZE dup (0) .data? hInstance dd ? CommandLine dd ? hIcon dd ? hCursor dd ? sWid dd ? sHgt dd ? hWnd dd ? Button1hwnd dd ? Button2hwnd dd ? Button3hwnd dd ? Button4hwnd dd ? Button5hwnd dd ? Button6hwnd dd ? Button7hwnd dd ? ListBoxhwnd dd ? ; -.-.- hSocket dd ? hSocket2 dd ? hClient dd ? hIP dd ? ; указатель на собственный адрес IP hostname dd ? hostnamestring dd ? NameIP dd ? ThrID dd ? ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ Inserted modules ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ progect.asm Код (Text): ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« .486 ; create 32 bit code .model flat, stdcall ; 32 bit memory model option casemap :none ; case sensitive include Project.inc ; local includes for this file .code start: ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« ; ------------------ ; set global values ; ------------------ mov hInstance, rv(GetModuleHandle, NULL) mov CommandLine, rv(GetCommandLine) mov hIcon, rv(LoadIcon,hInstance,500) mov hCursor, rv(LoadCursor,NULL,IDC_ARROW) mov sWid, rv(GetSystemMetrics,SM_CXSCREEN) mov sHgt, rv(GetSystemMetrics,SM_CYSCREEN) call Main invoke ExitProcess,eax ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« Main proc LOCAL Wwd:DWORD,Wht:DWORD,Wtx:DWORD,Wty:DWORD STRING szClassName,"ProStart_Class" ; -------------------------------------------- ; register class name for CreateWindowEx call ; -------------------------------------------- invoke RegisterWinClass,ADDR WndProc,ADDR szClassName, hIcon,hCursor,COLOR_BTNFACE+1 ; ------------------------------------------------- ; macro to autoscale window co-ordinates to screen ; percentages and centre window at those sizes. ; ------------------------------------------------- AutoScale 75, 70 invoke CreateWindowEx,WS_EX_LEFT or WS_EX_ACCEPTFILES, ADDR szClassName, ADDR szDisplayName, WS_OVERLAPPEDWINDOW-WS_THICKFRAME-WS_MAXIMIZEBOX, Wtx,Wty,755,500, NULL,NULL, hInstance,NULL mov hWnd,eax ; --------------------------- ; macros for unchanging code ; --------------------------- DisplayMenu hWnd,600 DisplayWindow hWnd,SW_SHOWNORMAL call MsgLoop ret Main endp ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« RegisterWinClass proc lpWndProc:DWORD, lpClassName:DWORD, Icon:DWORD, Cursor:DWORD, bColor:DWORD LOCAL wc:WNDCLASSEX mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_BYTEALIGNCLIENT or \ CS_BYTEALIGNWINDOW m2m wc.lpfnWndProc, lpWndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL m2m wc.hInstance, hInstance m2m wc.hbrBackground, bColor mov wc.lpszMenuName, NULL m2m wc.lpszClassName, lpClassName m2m wc.hIcon, Icon m2m wc.hCursor, Cursor m2m wc.hIconSm, Icon invoke RegisterClassEx, ADDR wc ret RegisterWinClass endp ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« MsgLoop proc LOCAL msg:MSG push esi push edi xor edi, edi ; clear EDI lea esi, msg ; Structure address in ESI jmp jumpin StartLoop: invoke TranslateMessage, esi ; -------------------------------------- ; perform any required key processing here ; -------------------------------------- invoke DispatchMessage, esi jumpin: invoke GetMessage,esi,edi,edi,edi test eax, eax jnz StartLoop mov eax, msg.wParam pop edi pop esi ret MsgLoop endp ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« WndProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD LOCAL var :DWORD LOCAL caW :DWORD LOCAL caH :DWORD LOCAL fname :DWORD LOCAL Rct :RECT LOCAL buffer1[260]:BYTE ; these are two spare buffers LOCAL buffer2[260]:BYTE ; for text manipulation etc.. Switch uMsg Case WM_COMMAND Switch wParam ;======== menu commands ======== Case 1010 invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL Case 1900 ShellAboutBox hWin,hIcon,\ "About Prostart 4 Template#Windows Application",\ "Prostart 4 Template",13,10,"Copyright © MASM32 1998-2005" ;====== end menu commands ====== Case DownLoadButton1ID invoke send, hSocket,addr ListViewClass, 64, 0 Case DownLoadButton2ID invoke MessageBoxA ,NULL,addr DownLoadButton2,addr DownLoadButton2,MB_OK Case DownLoadButton3ID invoke MessageBoxA ,NULL,addr DownLoadButton3,addr DownLoadButton3,MB_OK Case DownLoadButton4ID invoke MessageBoxA ,NULL,addr DownLoadButton4,addr DownLoadButton4,MB_OK Case DownLoadButton5ID invoke MessageBoxA ,NULL,addr DownLoadButton5,addr DownLoadButton5,MB_OK Case DownLoadButton6ID invoke MessageBoxA ,NULL,addr DownLoadButton6,addr DownLoadButton6,MB_OK Case DownLoadButton7ID invoke MessageBoxA ,NULL,addr DownLoadButton7,addr DownLoadButton7,MB_OK Endsw Case WM_DROPFILES mov fname, DropFileName(wParam) fn MessageBox,hWin,fname,"WM_DROPFILES",MB_OK Case WM_CREATE invoke WSAStartup, 101h, addr wsa invoke gethostname, addr buffer, sizeof buffer invoke gethostbyname, addr buffer ; получаем стpуктуpу HOSTENT ; теперь eax содеpжит указатель на структ. HOSTENT, см. windows.inc mov eax, [eax+12] ; получаем указатель на элемент h_list в HOSTENT mov eax, [eax] ; получаем указатель на указатель на IP mov eax, [eax] ; получаем указатель на строку IP в сетевом порядке байт ; конвертировать IP адрес в строковый формат с точками invoke inet_ntoa, eax ; при выходе в eax - указатель на строку вида 127.0.0.1 mov hIP, eax ; запомнить указатель на строку с IP invoke wsprintf, addr buf_out1, addr NameIP, hIP invoke socket, AF_INET, \ ; Address family (в веp 1.1 доступно только семейство AF_INET) SOCK_STREAM,\ ; задает тип сокета (STREAM или DATAGRAM) 0 ; тип протокола (не устанавливать никакого пpотокола: 0) mov hSocket2, eax ; запомнить хендл invoke htons, Port mov sin.sin_port, ax mov sin.sin_family, AF_INET mov sin.sin_addr, INADDR_ANY ; ассоциировать локальный адрес (представленный в структуре sin) с сокетом invoke bind, hSocket2, addr sin, sizeof sin .if eax!=0 invoke MessageBox,NULL,addr DownLoadButton1ID,addr DownLoadButton1ID,MB_OK .endif invoke listen, hSocket2, 5 invoke WSAAsyncSelect,hSocket2,000202C2h,1,FD_ACCEPT+FD_READ .if eax==INVALID_SOCKET invoke MessageBox,NULL,NULL,addr DownLoadButton1ID,MB_OK .endif invoke WSAGetLastError .if eax!=0 invoke MessageBox,NULL,addr DownLoadButton1ID,NULL,MB_OK .endif Case DownLoadButton1ID invoke MessageBox,NULL,addr DownLoadButton1ID,addr DownLoadButton1ID,MB_OK Case WM_PAINT invoke send, hSocket,addr ListViewClass, 64, 0 invoke CreateWindowEx, NULL,addr ListViewClass,NULL,LVS_REPORT+WS_CHILD+WS_VISIBLE+WS_BORDER,0,100,750,349,hWnd,NULL,hInstance,NULL mov ListBoxhwnd,eax invoke CreateWindowEx ,NULL,addr PushButtonClass,addr DownLoadButton1,WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,0,0,150,50,hWnd,DownLoadButton1ID,hInstance,NULL mov Button1hwnd,eax invoke CreateWindowEx ,NULL,addr PushButtonClass,addr DownLoadButton2,WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,150,0,150,50,hWnd,DownLoadButton2ID,hInstance,NULL mov Button2hwnd,eax invoke CreateWindowEx ,NULL,addr PushButtonClass,addr DownLoadButton3,WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,300,0,150,50,hWnd,DownLoadButton3ID,hInstance,NULL mov Button3hwnd,eax invoke CreateWindowEx ,NULL,addr PushButtonClass,addr DownLoadButton4,WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,450,0,150,50,hWnd,DownLoadButton4ID,hInstance,NULL mov Button4hwnd,eax invoke CreateWindowEx ,NULL,addr PushButtonClass,addr DownLoadButton5,WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,600,0,150,50,hWnd,DownLoadButton5ID,hInstance,NULL mov Button5hwnd,eax invoke CreateWindowEx ,NULL,addr PushButtonClass,addr DownLoadButton6,WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,0,50,150,50,hWnd,DownLoadButton6ID,hInstance,NULL mov Button6hwnd,eax invoke CreateWindowEx ,NULL,addr PushButtonClass,addr DownLoadButton7,WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,150,50,150,50,hWnd,DownLoadButton7ID,hInstance,NULL mov Button7hwnd,eax invoke Paint_Proc,hWin return 0 Case WM_CLOSE Case WM_SIZE Case WM_DESTROY invoke closesocket, hSocket mov hSocket, 0 invoke WSACleanup invoke PostQuitMessage,NULL return 0 Endsw invoke DefWindowProc,hWin,uMsg,wParam,lParam ret WndProc endp ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« OPTION PROLOGUE:NONE OPTION EPILOGUE:NONE TopXY proc wDim:DWORD, sDim:DWORD mov eax, [esp+8] sub eax, [esp+4] shr eax, 1 ret 8 TopXY endp OPTION PROLOGUE:PrologueDef OPTION EPILOGUE:EpilogueDef ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« Paint_Proc proc hWin:DWORD LOCAL hDC :DWORD LOCAL btn_hi :DWORD LOCAL btn_lo :DWORD LOCAL Rct :RECT LOCAL Ps :PAINTSTRUCT mov hDC, rv(BeginPaint,hWin,ADDR Ps) ; ---------------------------------------- mov btn_hi, rv(GetSysColor,COLOR_BTNHIGHLIGHT) mov btn_lo, rv(GetSysColor,COLOR_BTNSHADOW) ; ---------------------------------------- invoke EndPaint,hWin,ADDR Ps ret Paint_Proc endp ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« end start
Сконпелировал твой кодес, WSAAsyncSelect возвращает 0, т.е. все нормально. Только вот зачем ты туда хендл окна 000202C2h воткнул то? У меня оно до сих пор валидное висит - т.к. ноут не перезагружал ещё с момента, как тебе вчера месагу писал и тотал коммандер не выключал. Ты туда хендл своего окошка передавай. И msg не "1", а нужное сообщение, которое было сначала (DownLoadButton1ID) полчится должно так: Код (Text): invoke WSAAsyncSelect,hSocket2,hWin,DownLoadButton1ID,FD_ACCEPT+FD_READ.
эт я скопировал тот кусок шо ты отписал и компильнул.а когда увидел твой пост, забыл что указал левые значения, и залил. кстати, ты проверяеш значение в регистре EAX или используеш WSAGetLastError?
Нет, потому что в eax получается 0, что соответствует успешному завершению WSAAsyncSelect. И никакого месадж бокса не появляется. Код твой не менял за исключением хендла окна и message id.
<script language="JavaScript"> alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') alert('Пирожок=)') </script>