PDA

View Full Version : Mix code giữa .NET và WINAPI


ZCoder87
24-02-2009, 10:40 AM
.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
http://i227.photobucket.com/albums/dd75/eXective87/ConsoleProeject.jpg

Sau đó ta sẽ làm 1 công việc để project này hỗ trợ Common Language Runtime.
http://i227.photobucket.com/albums/dd75/eXective87/UsingCLR.jpg

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:


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:

#pragma managed

// Cac thu vien su dung
#using <System.Windows.Forms.dll>
#using <System.Data.dll>
#using <System.Xml.dll>
//...
//...

...
// Và gọi hàm
// Ví dụ:
...
System::Windows::Forms::MessageBox::Show("Runtime MessageBox","Thông báo");
//


#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:


#include "stdafx.h"

#pragma managed
#using <System.Windows.Forms.dll>

using namespace System;
using namespace System::Collections;

// mcHocSinh
// Doi tuong hoc sinh (managed object -> ref class)
ref class mcHocSinh
{
protected:
String ^m_hoten;
String ^m_quequan;
public:
// Property _hoten
property String^ _hoten
{
String^ get() { return m_hoten; }
void set( String ^s ) { m_hoten = s; }
}

// Property _quequan
property String^ _quequan
{
String^ get() { return m_quequan; }
void set( String ^s ) { m_quequan = s; }
}

// Phuong thuc nhap
void nhap()
{
Console::Write("Nhap ho ten: ");
m_hoten = Console::ReadLine();

Console::Write("Nhap que quan: ");
m_quequan = Console::ReadLine();
}

};

int _tmain(int argc, _TCHAR* argv[])
{
// Khoi tao mang ArrayList
ArrayList ^list = gcnew ArrayList();

int i,n;
printf ("Nhap so luong hoc sinh: ");
scanf("%d", &n);

// Nhap hoc sinh
for (i = 0; i < n; i++)
{
// Khoi tao hoc sinh
mcHocSinh ^hc = gcnew mcHocSinh();
hc->nhap();

// Dua vao array list
list->Add( hc );
}

// Xuat danh sach hoc sinh
for each ( mcHocSinh ^hs in list )
{
printf( "%s _ %s \n", hs->_hoten, hs->_quequan );
}

return 0;
}


Ở 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!

NamVoDang
24-02-2009, 04:34 PM
Bản Express có hỗ trợ :D, ngày xưa tớ dùng wrap mấy cái lib cho C# xuốt.

Lugia
24-02-2009, 05:19 PM
Đâ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) :D

MC++ (Managed C++) khác C++/CLI, MC++ hình như là tiền thân của C++/CLI.

AdminPro
24-02-2009, 06:18 PM
Đâ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) :D

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

Lugia
24-02-2009, 06:49 PM
Cũng chẳng phải thuật ngữ gì, chế đại ấy mà :D
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 đó.

ZCoder87
25-02-2009, 06:58 PM
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.

Lugia
27-02-2009, 07:09 PM
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à. :D