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

Đề tài: Mix code giữa .NET và WINAPI

  1. #1
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Mặc định Mix code giữa .NET và WINAPI

    .NET đã ra đời cũng được 5 năm rồi và người ta cũng cảm thấy nó có rất nhiều lợi ích bởi sự tiện dụng, và phát triển ứng dụng nhanh.

    Nhưng một câu hỏi là nếu chúng ta đang lập trình ở lớp dưới (WIN32 Console, Win32 Application, MFC) thì có thể sử dụng được các object của .NET hay không??
    Dĩ nhiên là được và hôm nay ZC sẽ chia sẻ 1 thủ thuật nhỏ để làm được điều này. (Lưu ý: bản visual studio express không hỗ trợ).

    Bây giờ ZC sẽ tạo 1 project console 32


    Sau đó ta sẽ làm 1 công việc để project này hỗ trợ Common Language Runtime.


    Và biên dịch thử chương trình thì bạn để ý sau khi kết thúc thì output của nó sẽ có thêm dòng sau:

    Code:
    The thread 'Win32 Thread' (0xf04) has exited with code 0 (0x0).
    The thread 'Win32 Thread' (0x5d4) has exited with code 0 (0x0).
    The program '[2304] MixDotNET.exe: Managed' has exited with code 0 (0x0).
    The program '[2304] MixDotNET.exe: Native' has exited with code 0 (0x0).
    Điều này có nghĩa rằng Common Language Runtime đã quản lý chương trình. Tuy nhiên nó chỉ quản lý những đối tượng của .NET.

    Bây giờ chúng ta sẽ code:
    C++ Code:
    1. #pragma managed
    2.  
    3. // Cac thu vien su dung
    4. #using <System.Windows.Forms.dll>
    5. #using <System.Data.dll>
    6. #using <System.Xml.dll>
    7. //...
    8. //...
    9.  
    10. ...
    11. // Và gọi hàm
    12. // Ví dụ:
    13. ...
    14. System::Windows::Forms::MessageBox::Show("Runtime MessageBox","Thông báo");
    15. //

    #pragma managed là 1 chỉ thị của Vistual Studio nó cho phép chúng ta sử dụng ngôn ngữ Managed C++ Trong project.
    Nếu tới đoạn code nào ko cần thiết dùng .NET bạn có thể tắt nó đi #pragma unmanaged

    Sau đó là các thư viện .NET sẽ sử dụng #using ( khai báo này tương đương với references ở C# )

    Mình sẽ code 1 chương trình nhỏ sử dụng ArrayList và Managed Object:

    C++ Code:
    1. #include "stdafx.h"
    2.  
    3. #pragma managed
    4. #using <System.Windows.Forms.dll>
    5.  
    6. using namespace System;
    7. using namespace System::Collections;
    8.  
    9. // mcHocSinh
    10. // Doi tuong hoc sinh (managed object -> ref class)
    11. ref class mcHocSinh
    12. {
    13. protected:
    14.     String  ^m_hoten;
    15.     String  ^m_quequan;
    16. public:
    17.     // Property _hoten
    18.     property String^ _hoten
    19.     {
    20.         String^ get() { return m_hoten; }
    21.         void set( String ^s ) { m_hoten = s; }
    22.     }
    23.  
    24.     // Property _quequan
    25.     property String^ _quequan
    26.     {
    27.         String^ get() { return m_quequan; }
    28.         void set( String ^s ) { m_quequan = s; }
    29.     }
    30.    
    31.     // Phuong thuc nhap
    32.     void nhap()
    33.     {
    34.         Console::Write("Nhap ho ten: ");
    35.         m_hoten = Console::ReadLine();
    36.  
    37.         Console::Write("Nhap que quan: ");
    38.         m_quequan = Console::ReadLine();
    39.     }
    40.  
    41. };
    42.  
    43. int _tmain(int argc, _TCHAR* argv[])
    44. {
    45.     // Khoi tao mang ArrayList
    46.     ArrayList ^list = gcnew ArrayList();
    47.    
    48.     int i,n;
    49.     printf ("Nhap so luong hoc sinh: ");
    50.     scanf("%d", &n);
    51.  
    52.     // Nhap hoc sinh
    53.     for (i = 0; i < n; i++)
    54.     {
    55.         // Khoi tao hoc sinh
    56.         mcHocSinh ^hc = gcnew mcHocSinh();
    57.         hc->nhap();
    58.  
    59.         // Dua vao array list
    60.         list->Add( hc );
    61.     }
    62.    
    63.     // Xuat danh sach hoc sinh
    64.     for each ( mcHocSinh ^hs in list )
    65.     {
    66.         printf( "%s _ %s \n", hs->_hoten, hs->_quequan );
    67.     }
    68.  
    69.     return 0;
    70. }

    Ở MC++ thì chúng ta sử dụng:
    - pointer^ thay cho* (vì đây là con trỏ chỉ vào managed object)
    - gcnew thay cho new để cấp phát Managed object (ko cần delete)


    Đoạn code trên sử dụng Collections, Tương tự thì ta vẫn có thể sử dụng ADO.NET ở MFC hay cả Win32APP. Nhưng để lập trình tốt mixing code này thì đòi hỏi bạn phải học thêm 1 ngôn ngữ nữa là C++.NET hay còn gọi là MC++ ( và còn 1 cái tên nữa là C++/CLI)

    Chúc các bạn vui!
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 24-02-2009 lúc 11:00 AM.

  2. #2
    Ngày gia nhập
    09 2008
    Nơi ở
    Kĩ viện
    Bài viết
    169

    Bản Express có hỗ trợ , ngày xưa tớ dùng wrap mấy cái lib cho C# xuốt.
    Phá toái hư không - Bạch nhật thăng thiên.

  3. #3
    Ngày gia nhập
    04 2007
    Bài viết
    134

    Đây là best feature của C++/CLI chứ ko phải chỉ là 1 thủ thuật đâu, ebook C++/CLI là nó toàn nói 3 cái này mà.
    Cứ tạo 1 CLR Project rồi vào tha hồ mix code, mix library, thích thì ^, thích thì * (ko cần bật #pragma managed)

    MC++ (Managed C++) khác C++/CLI, MC++ hình như là tiền thân của C++/CLI.
    Đã được chỉnh sửa lần cuối bởi Lugia : 24-02-2009 lúc 05:21 PM.

  4. #4
    Ngày gia nhập
    01 2009
    Bài viết
    201

    Trích dẫn Nguyên bản được gửi bởi Lugia Xem bài viết
    Đây là best feature của C++/CLI chứ ko phải chỉ là 1 thủ thuật đâu, ebook C++/CLI là nó toàn nói 3 cái này mà.
    Cứ tạo 1 CLR Project rồi vào tha hồ mix code, mix library, thích thì ^, thích thì * (ko cần bật #pragma managed)

    MC++ (Managed C++) khác C++/CLI, MC++ hình như là tiền thân của C++/CLI.
    Mình không hiểu thuật ngữ mix code, mix library là gì,bạn có thể giải thích không

  5. #5
    Ngày gia nhập
    04 2007
    Bài viết
    134

    Cũng chẳng phải thuật ngữ gì, chế đại ấy mà
    Nghĩa là vừa có thể xài syntax mới, vừa có thể xài theo kiểu C/C++ truyền thống. Tương tự với library, vừa xài dc library của .NET, vừa xài dc mấy cái library truyền thống của C/C++, như code minh họa của ZCoder đó.

  6. #6
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Mặc định Mix code giữa .NET và WINAPI

    Trích dẫn Nguyên bản được gửi bởi namvodang
    ngày xưa tớ dùng wrap mấy cái lib cho C# xuốt.
    Cách mà cậu dùng là từ trên gọi xuống. Có nghĩa là từ .NET cậu sử dụng API.

    Còn cái mà tớ đang nói đây là ngược lại, có nghĩa là từ API ta sử dụng các lớp trên của .NET.

    Nghe thì hơi kỳ nhưng 2 cái hoàn toàn khác nhau vì wrap là cậu dùng cho các ngôn ngữ ở .NET. Còn hướng dẫn của tớ là dùng cho các project MFC, WIN32 nếu cảm thấy cần thiết sử dụng các object ở .NET.

  7. #7
    Ngày gia nhập
    04 2007
    Bài viết
    134

    Tui thấy bản chất giống nhau cả thôi, chỉ có điều cách dùng khác nhau.
    Chương trình kiểu này nên coi là .Net đi, vì compile sẽ ra bytecode, khi chạy cần .Net framework mà.

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

    Giả sử mình đang có sẵn class viết bằng C++ (và đóng gói thành DLL) (hiện giờ chỉ gồm file H, Lib và DLL)
    làm thế nào để wrap cho 1 ứng dụng C# có thể dùng class đó được, thanks

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

  1. TP HCM Công ty VNG tuyển Senior C++/WinAPI/MFC
    Gửi bởi L.N.T.A trong diễn đàn Tuyển dụng - Việc làm CNTT
    Trả lời: 0
    Bài viết cuối: 27-02-2013, 12:18 PM
  2. Sách lập trình C Sách Tiếng Việt Về WinAPI
    Gửi bởi choaipro trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 2
    Bài viết cuối: 10-08-2011, 03:43 PM
  3. Chương trình ViewDisk - Sử dụng WinAPI để đọc đĩa trong C#
    Gửi bởi khoaimon trong diễn đàn Dự án & Source code C#, ASP.NET
    Trả lời: 4
    Bài viết cuối: 11-05-2011, 02:18 AM
  4. C Library vs WINAPI
    Gửi bởi ZCoder87 trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 04-10-2009, 09:30 PM
  5. Chương trình winAPI
    Gửi bởi haba trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 04-04-2009, 03:49 PM

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