Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: WIN32API sửa lỗi ứng dụng chát

  1. #1
    Ngày gia nhập
    09 2008
    Bài viết
    328

    Angry WIN32API sửa lỗi ứng dụng chát

    Visual C++ Code:
    1. #include <windows.h>
    2. #include <windowsx.h>
    3. #include <commctrl.h>
    4. #include <winsock.h>
    5. #include "Chat1.h"
    6. #pragma comment (lib,"ws2_32.lib")
    7. //Dialog procedures
    8. BOOL CALLBACK DlgProc(HWND hdwnd, UINT Message, WPARAM wParam, LPARAM
    9.   lParam);
    10. BOOL CALLBACK ConnectDlgProc(HWND hdwnd, UINT Message, WPARAM wParam, LPARAM
    11.   lParam);
    12. BOOL CALLBACK ListenDlgProc(HWND hdwnd, UINT Message, WPARAM wParam, LPARAM
    13.   lParam);
    14.    
    15. int TryConnect(long hostname, int PortNo);
    16. int ListenOnPort(int PortNo);
    17.  
    18. char Title[] = "ChatMate";
    19.  
    20. HINSTANCE hInst = NULL;
    21. HWND hwnd, hStatus;
    22.  
    23. SOCKET s;
    24. SOCKADDR_IN from;
    25. int fromlen = sizeof(from);
    26.  
    27. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    28.     LPSTR lpCmdLine, int nCmdShow)
    29. {
    30.       hInst = hInstance;
    31.       int x = ::DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN),
    32.                         NULL, DlgProc);
    33.       TCHAR s[10];
    34.       wsprintf(s,L"%d",x);
    35.       ::MessageBox(0,s,L"Ket qua ra -1 la loi ham DialogBox",0);
    36.       return 0;
    37. }
    38.  
    39. void GetTextandAddLine(char Line[], HWND hParent, int IDC)
    40. {
    41.     HWND hEdit = GetDlgItem(hParent, IDC);
    42.     int nTxtLen = GetWindowTextLength(hEdit); // Get length of existing text
    43.     SendMessage(hEdit, EM_SETSEL, nTxtLen, nTxtLen);    // move caret to end
    44.     SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)Line);     // append text
    45.     SendMessage(hEdit, EM_SCROLLCARET, 0, 0);       // scroll to caret
    46. } //End function  
    47.  
    48. BOOL CALLBACK DlgProc(HWND hdwnd, UINT Message, WPARAM wParam, LPARAM
    49.   lParam)
    50. {
    51. switch(Message)
    52.     {
    53.    
    54.     case WM_INITDIALOG:
    55.     {
    56.         //Our dialog box is being created
    57.         hwnd = hdwnd;
    58.        
    59.         hStatus = GetDlgItem(hdwnd, ID_STATUS_MAIN);
    60.     }
    61.     return TRUE;
    62.    
    63.     //Winsock related message...
    64.     case 1045:
    65.         switch (lParam)
    66.         {
    67.                 case FD_CONNECT: //Connected OK
    68.                     MessageBeep(MB_OK);
    69.                     SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Connection Established.");
    70.                 break;
    71.                
    72.                 case FD_CLOSE: //Lost connection
    73.                     MessageBeep(MB_ICONERROR);
    74.                    
    75.                     //Clean up
    76.                     if (s) closesocket(s);
    77.                     WSACleanup();
    78.                    
    79.                     SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Connection to Remote Host Lost.");                
    80.                 break;
    81.                
    82.                 case FD_READ: //Incoming data to receive
    83.                     char buffer[80];
    84.                     memset(buffer, 0, sizeof(buffer)); //Clear the buffer
    85.                    
    86.                     recv (s, buffer, sizeof(buffer)-1, 0); //Get the text
    87.                    
    88.                     GetTextandAddLine(buffer, hwnd, ID_EDIT_DATA); //Display it
    89.                 break;
    90.                
    91.                 case FD_ACCEPT: //Connection request
    92.                 {
    93.                     MessageBeep(MB_OK);
    94.                    
    95.                     SOCKET TempSock = accept(s, (struct sockaddr*)&from, &fromlen);
    96.                     s = TempSock; //Switch our old socket to the new one
    97.                    
    98.                     char szAcceptAddr[100];
    99.                     wsprintfA(szAcceptAddr, "Connection from [%s] accepted.",
    100.                       inet_ntoa(from.sin_addr));
    101.                      
    102.                     SendMessage(hStatus, SB_SETTEXT, 0,
    103.                       (LPARAM)szAcceptAddr);
    104.                 }
    105.                 break;
    106.         }
    107.     break;
    108.  
    109.     case WM_COMMAND:
    110.         switch(LOWORD(wParam))
    111.         {
    112.                 case ID_BTN_CONNECT:
    113.                   return DialogBox(hInst, MAKEINTRESOURCE(DLG_CONNECT),
    114.                                         NULL, ConnectDlgProc);
    115.                 break;
    116.  
    117.                 case ID_BTN_LISTEN:
    118.                   return DialogBox(hInst, MAKEINTRESOURCE(DLG_LISTEN),
    119.                                         NULL, ListenDlgProc);                
    120.                 break;
    121.                
    122.                 case ID_BTN_CLEAR: //Clear edit and disconnect
    123.                 {
    124.                     if (s) //If there's a connection
    125.                     {
    126.                         int a = MessageBoxA(hdwnd, "Are you sure you want to end the current connection?",
    127.                                         "End Connection", MB_ICONQUESTION | MB_YESNO);
    128.                         if (a == IDYES)
    129.                         {
    130.                             SendDlgItemMessage(hdwnd, ID_EDIT_DATA, WM_SETTEXT, 0, (LPARAM)"");
    131.                             closesocket(s); //Shut down socket
    132.                             WSACleanup(); //Clean up Winsock
    133.                         }
    134.                     }
    135.                 }
    136.                 break;
    137.                
    138.                 case ID_BTN_SEND: //Send data
    139.                 {
    140.                     int len = GetWindowTextLength(GetDlgItem(hdwnd, ID_EDIT_SEND));
    141.                    
    142.                     if (len) //If there's text in the reply box...
    143.                     {
    144.                         if (s)
    145.                         {
    146.                             char* Data;
    147.                             Data = (char*)GlobalAlloc(GPTR, len + 1);
    148.                            
    149.                             GetDlgItemTextA(hdwnd, ID_EDIT_SEND, Data, len + 1);
    150.  
    151.                             //Add a carriage return and line feed before sending data
    152.                             char szTemp[100];
    153.                            
    154.                             wsprintfA(szTemp, "%s\r\n", Data);
    155.                            
    156.                             send(s, szTemp, len+strlen(szTemp)+1, 0); //Send the string
    157.                            
    158.                             SetDlgItemTextA(hdwnd, ID_EDIT_SEND, ""); //Reset the textbox
    159.                            
    160.                             wsprintfA(szTemp, "[You said:] %s\r\n", Data);
    161.                             GetTextandAddLine(szTemp, hdwnd, ID_EDIT_DATA); //Add this line to our textbox
    162.                            
    163.                             GlobalFree((HANDLE)Data); //Free the memory: Important!!
    164.                         }
    165.                         else
    166.                         {
    167.                         //We aren't connected!!
    168.                         MessageBoxA(hwnd, "No established connection detected.",
    169.                           Title, MB_ICONERROR | MB_OK);
    170.                         }
    171.                     }
    172.                 }
    173.                 break;
    174.                
    175.                 case IDCANCEL:
    176.                     //Clean up
    177.                     if (s) closesocket(s);
    178.                     WSACleanup();
    179.                    
    180.                     EndDialog(hdwnd, IDOK);
    181.                 break;
    182.         } //End switch
    183.         default:
    184.             return FALSE;
    185.     break;
    186.     } //End Message switch
    187.     return TRUE;
    188. }
    189.  
    190. BOOL CALLBACK ConnectDlgProc(HWND hdwnd, UINT Message, WPARAM wParam, LPARAM
    191.   lParam)
    192. {
    193. switch(Message)
    194.     {
    195.     case WM_INITDIALOG:
    196.     {
    197.         //Our dialog box is being created
    198.     }
    199.     return TRUE;
    200.  
    201.     case WM_COMMAND:
    202.         switch(LOWORD(wParam))
    203.         {
    204.                 case ID_BTN_GO:
    205.                 {
    206.                     int len = GetWindowTextLength(GetDlgItem(hdwnd, ID_EDIT_HOST));
    207.                     int lenport = GetWindowTextLength(GetDlgItem(hdwnd, ID_EDIT_PORT));
    208.                    
    209.                     if (!lenport) return 0; //Was the port specified?
    210.                    
    211.                     int portno = GetDlgItemInt(hdwnd, ID_EDIT_PORT, 0, 0);
    212.                    
    213.                     if (len)
    214.                     {
    215.                             char* Data;
    216.                             Data = (char*)GlobalAlloc(GPTR, len + 1); //Allocate memory
    217.                    
    218.                             GetDlgItemTextA(hdwnd, ID_EDIT_HOST, Data, len + 1); //Get text into buffer
    219.                    
    220.                             if (!gethostbyname(Data))
    221.                             {
    222.                             //Couldn't get hostname; assume it's an IP Address
    223.                                 long hostname = inet_addr(Data);
    224.                                 if(!TryConnect(hostname, portno))
    225.                                 {
    226.                                     MessageBoxA(hdwnd, "Could not connect to remote host.", Title, MB_ICONERROR | MB_OK);
    227.                                     if (s) closesocket(s); //Shut down socket
    228.                                 }
    229.                             }
    230.                            
    231.                             GlobalFree((HANDLE)Data); //Free memory
    232.                            
    233.                             EndDialog(hdwnd, IDOK);
    234.                     }
    235.                 }
    236.                 break;
    237.  
    238.                 case IDCANCEL:
    239.                     EndDialog(hdwnd, IDOK);
    240.                 break;
    241.         } //End switch
    242.         default:
    243.             return FALSE;
    244.     break;
    245.     } //End Message switch
    246.     return TRUE;
    247. }
    248.  
    249. BOOL CALLBACK ListenDlgProc(HWND hdwnd, UINT Message, WPARAM wParam, LPARAM
    250.   lParam)
    251. {
    252. switch(Message)
    253.     {
    254.     case WM_INITDIALOG:
    255.     {
    256.         //Our dialog box is being created
    257.     }
    258.     return TRUE;
    259.  
    260.     case WM_COMMAND:
    261.         switch(LOWORD(wParam))
    262.         {
    263.                 case ID_BTN_GO:
    264.                 {
    265.                     int lenport = GetWindowTextLength(GetDlgItem(hdwnd, ID_EDIT_PORT));
    266.                     if (!lenport) return 0; //Was the port specified?
    267.                    
    268.                     int portno = GetDlgItemInt(hdwnd, ID_EDIT_PORT, 0, 0);
    269.                    
    270.                     if (!ListenOnPort(portno))
    271.                     {
    272.                         if (s) closesocket(s);
    273.                         MessageBoxA(hdwnd, "Error listening on specified port.", Title, MB_ICONERROR | MB_OK);
    274.                     }                                                            
    275.                     EndDialog(hdwnd, IDOK);
    276.                 }
    277.                 break;
    278.  
    279.                 case IDCANCEL:
    280.                     EndDialog(hdwnd, IDOK);
    281.                 break;
    282.         } //End switch
    283.         default:
    284.             return FALSE;
    285.     break;
    286.     } //End Message switch
    287.     return TRUE;
    288. }
    289.  
    290. int TryConnect(long hostname, int PortNo)
    291. {
    292.     WSADATA w; //Winsock startup info
    293.     SOCKADDR_IN target; //Information about host
    294.    
    295.     int error = WSAStartup (0x0202, &w);   // Fill in WSA info
    296.      
    297.     if (error)
    298.     { // there was an error
    299.       return 0;
    300.     }
    301.     if (w.wVersion != 0x0202)
    302.     { // wrong WinSock version!
    303.       WSACleanup (); // unload ws2_32.dll
    304.       return 0;
    305.     }
    306.    
    307.     s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); // Create socket
    308.     if (s == INVALID_SOCKET)
    309.     {
    310.         return 0;
    311.     }
    312.  
    313.     target.sin_family = AF_INET;           // address family Internet
    314.     target.sin_port = htons (PortNo);        // set server’s port number
    315.     target.sin_addr.s_addr = hostname;  // set server’s IP
    316.      
    317.     //Try connecting...
    318.     if (connect(s, (SOCKADDR *)&target, sizeof(target)) == SOCKET_ERROR) //Try binding
    319.     { // error
    320.           return 0;
    321.     }
    322.     WSAAsyncSelect (s, hwnd, 1045, FD_READ | FD_CONNECT | FD_CLOSE);
    323.         //Switch to Non-Blocking mode
    324.        
    325.     SendMessage(hStatus, WM_SETTEXT, 0, (LPARAM)"Connected to Remote Host.");
    326.    
    327.     return 1; //OK
    328. }
    329.  
    330. int ListenOnPort(int PortNo)
    331. {
    332.     WSADATA w;
    333.    
    334.     int error = WSAStartup (0x0202, &w);   // Fill in WSA info
    335.      
    336.     if (error)
    337.     { // there was an error
    338.         SendMessage(hStatus, WM_SETTEXT, 0, (LPARAM)"Could not initialize Winsock.");
    339.       return 0;
    340.     }
    341.     if (w.wVersion != 0x0202)
    342.     { // wrong WinSock version!
    343.       WSACleanup (); // unload ws2_32.dll
    344.       SendMessage(hStatus, WM_SETTEXT, 0, (LPARAM)"Wrong Winsock version.");
    345.       return 0;
    346.     }
    347.    
    348.     SOCKADDR_IN addr; // the address structure for a TCP socket
    349.    
    350.     addr.sin_family = AF_INET;      // Address family Internet
    351.     addr.sin_port = htons (PortNo);   // Assign port to this socket
    352.     addr.sin_addr.s_addr = htonl (INADDR_ANY);   // No destination
    353.    
    354.     s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); // Create socket
    355.    
    356.     if (s == INVALID_SOCKET)
    357.     {
    358.         SendMessage(hStatus, WM_SETTEXT, 0, (LPARAM)"Could not create socket.");
    359.         return 0;
    360.     }
    361.    
    362.     if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR) //Try binding
    363.     { // error
    364.         SendMessage(hStatus, WM_SETTEXT, 0, (LPARAM)"Could not bind to IP.");
    365.         return 0;
    366.     }
    367.    
    368.     listen(s, 10); //Start listening
    369.     WSAAsyncSelect (s, hwnd, 1045, FD_READ | FD_CONNECT | FD_CLOSE | FD_ACCEPT); //Switch to Non-Blocking mode
    370.    
    371.     char szTemp[100];
    372.     wsprintfA(szTemp, "Listening on port %d...", PortNo);
    373.    
    374.     SendMessage(hStatus, WM_SETTEXT, 0, (LPARAM)szTemp);  
    375.     return 1;
    376. }

    Mình nghĩ chắc bị lỗi cái hàm tạo dialog mà không biết cách sửa thế nào ???
    Attached Files Attached Files
    Tham gia diễn đàn MACOS http://www.apple9.com/forum

  2. #2
    Ngày gia nhập
    10 2008
    Nơi ở
    Quảng Trị
    Bài viết
    369

    Sao mà mình thích mấy câu hỏi về WinAPI thế nhỉ !!
    Thực ra đoạn code của bạn ko có lỗi mà lỗi nằm ở chỗ Dialog chưa có trong Resource
    Born to walk against the wind... Born to hear my name...
    Stand and fight... Live by your heart...
    Always one more try... I'm not afraid to die...
    Stand and fight... say what you feel...
    Born with a heart of steel ...

  3. #3
    Ngày gia nhập
    09 2008
    Bài viết
    328

    Với đoạn code chạy trên DEV thế này làm sao mình có thể chạy trên VC++ bây giờ
    Attached Files Attached Files
    Tham gia diễn đàn MACOS http://www.apple9.com/forum

  4. #4
    Ngày gia nhập
    10 2008
    Nơi ở
    Quảng Trị
    Bài viết
    369

    Source code phía trên đã chạy được rồi đấy, chỉ cần add thêm file Chat1.rc trong file phía dưới là ok thôi
    Mà vì sao phải chuyển qua VS? DevCPP cũng tốt lắm mà
    Đã được chỉnh sửa lần cuối bởi nguyenbinh07 : 21-03-2009 lúc 05:08 PM.
    Born to walk against the wind... Born to hear my name...
    Stand and fight... Live by your heart...
    Always one more try... I'm not afraid to die...
    Stand and fight... say what you feel...
    Born with a heart of steel ...

  5. #5
    Ngày gia nhập
    09 2008
    Bài viết
    328

    không được cậu ah,mình đã định lên rồi đó nhưng không được,nó báo lỗi mà
    nếu có gì cậu sửa hộ mình đi,thank cậu
    Attached Files Attached Files
    Tham gia diễn đàn MACOS http://www.apple9.com/forum

  6. #6
    Ngày gia nhập
    10 2008
    Nơi ở
    Quảng Trị
    Bài viết
    369

    Mặc định WIN32API sửa lỗi ứng dụng chát

    Trích dẫn Nguyên bản được gửi bởi trần trân Xem bài viết
    không được cậu ah,mình đã định lên rồi đó nhưng không được,nó báo lỗi mà
    nếu có gì cậu sửa hộ mình đi,thank cậu
    Cái source code của bạn thiếu cái

    Visual C++ Code:
    1. #pragma comment (lib, "ws2_32.lib")
    )

    T

    Còn lại là tốt cả, chạy được
    Born to walk against the wind... Born to hear my name...
    Stand and fight... Live by your heart...
    Always one more try... I'm not afraid to die...
    Stand and fight... say what you feel...
    Born with a heart of steel ...

  7. #7
    Ngày gia nhập
    09 2008
    Bài viết
    328

    Output Code:
    1. 1>------ Build started: Project: Win32, Configuration: Release Win32 ------
    2. 1>Compiling...
    3. 1>Chat1.cpp
    4. 1>.\Chat1.cpp(348) : warning C4101: 'client' : unreferenced local variable
    5. 1>Compiling resources...
    6. 1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
    7. 1>Copyright (C) Microsoft Corporation.  All rights reserved.
    8. 1>.\Chat1.rc(28) : warning RC2182 : duplicate dialog control ID 0
    9. 1>.\Chat1.rc(29) : warning RC2182 : duplicate dialog control ID 0
    10. 1>.\Chat1.rc(41) : warning RC2182 : duplicate dialog control ID 0
    11. 1>.\ChatMate_private.rc(11) : error RC2135 : file not found: ChatMate.exe.Manifest
    12. 1>Build log was saved at "file://f:\vCSharp\Win32\Win32\Release\BuildLog.htm"
    13. 1>Win32 - 1 error(s), 4 warning(s)
    14. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

    cái đó mình thử rồi mà,nó báo lỗi ở cái FIle .rc đó( nó đây nè chỗ dòng mầu đỏ nha)

    // THIS FILE WILL BE OVERWRITTEN BY DEV-C++!
    // DO NOT EDIT!

    #include "Chat1.rc"

    //
    // SUPPORT FOR WINDOWS XP THEMES:
    // THIS WILL MAKE THE PROGRAM USE THE COMMON CONTROLS
    // LIBRARY VERSION 6.0 (IF IT IS AVAILABLE)
    //
    1 24 "ChatMate.exe.Manifest"
    Tham gia diễn đàn MACOS http://www.apple9.com/forum

  8. #8
    Ngày gia nhập
    10 2008
    Nơi ở
    Quảng Trị
    Bài viết
    369

    Xóa file ChatMate_private.rc khỏi project nữa
    Vì trong Dev-CPP thì file này được tạo lúc compile
    Born to walk against the wind... Born to hear my name...
    Stand and fight... Live by your heart...
    Always one more try... I'm not afraid to die...
    Stand and fight... say what you feel...
    Born with a heart of steel ...

  9. #9
    Ngày gia nhập
    09 2008
    Bài viết
    328

    hehe,Nếu thế thì lại Lỗi không tạo được Dialog như đoạn code đầu
    Tham gia diễn đàn MACOS http://www.apple9.com/forum

  10. #10
    Ngày gia nhập
    10 2008
    Nơi ở
    Quảng Trị
    Bài viết
    369

    Làm j` mà khó khăn thế bạn?? Mình đem cái code trong file Win32.rar của bạn về thấy trong project đó có 2 file *.rc là Chat1.rc và ChatMate_private.rc. File Chat1.rc là file chính chứa Dialog và các control còn file ChatMate_private.rc là do Dev-cpp tạo như mình nói ở trên. Remove nó ra khỏi project rồi thêm dòng #pragma comment (lib, "ws2_32.lib") là chạy được mà
    Born to walk against the wind... Born to hear my name...
    Stand and fight... Live by your heart...
    Always one more try... I'm not afraid to die...
    Stand and fight... say what you feel...
    Born with a heart of steel ...

Các đề tài tương tự

  1. Java có làm việc với Win32API như C# không ?
    Gửi bởi drcool trong diễn đàn Thắc mắc lập trình Java
    Trả lời: 2
    Bài viết cuối: 17-05-2012, 08:33 PM
  2. Cách làm cho chương trình Win32API có giao diện XP?
    Gửi bởi Socket trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 20-12-2010, 03:08 PM
  3. [help] Chương trình Win32API
    Gửi bởi Socket trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 16-11-2010, 02:55 PM
  4. Lập trình win32API. Hướng dẫn cách tắt màn Hình
    Gửi bởi AlexF trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 07-07-2010, 05:02 PM
  5. WIN32API có hàm nào so sánh Dữ Liệu của 2 File không
    Gửi bởi cSharp trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 7
    Bài viết cuối: 09-02-2009, 09:54 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn