Archive for the Uncategorized Category

Download files từ DivShare bằng fake IP

Posted in Uncategorized on Tháng Năm 2, 2008 by Phạm Quang Hoà

Trong lúc chưa chuyển được hết các file trong blog này sang server khác, các bạn có thể download các file bằng cách fake IP.

Đối với IE:

1. Vào Tools | Internet Options

2. Chọn tab Connections, LAN Settings, tick vào Automatically detect settings và Use a proxy server for your LAN..

3. Điền Address và Port rồi OK.

Sau đó có thể vào download các file, tốc độ có thể không được nhanh.

Ghi chú:

- Các địa chỉ proxy có thể tra cứu tại: http://www.publicproxyservers.com/. Proxy đã kiểm tra thành công vào thời điểm viết bài: 66.8.86.237:8080

- Chi tiết cài đặt cho các trình duyệt khác có thể tham khảo tại: http://www.diendantinhoc.vn/showthread.php?p=4424

- Nếu dùng các trình quản lý download như IDM, cần phải đặt lại Proxy trong Options.

Tạo giao diện đa ngôn ngữ

Posted in Uncategorized on Tháng Năm 25, 2007 by Phạm Quang Hoà

Giới thiệu

Khi viết ứng dụng, chúng ta thường tạo giao diện theo một ngôn ngữ nào đó, ví dụ như tiếng Anh hay tiếng Việt. Các ứng dụng này khi muốn chuyển đổi sang ngôn ngữ khác, thì phải sửa lại toàn bộ giao diện và dịch lại chương trình. Để hỗ trợ khả năng chuyển đổi ngôn ngữ trong khi chạy, một trong những phương pháp thường được sử dụng là tạo một bảng ánh xạ các xâu ký tự theo các ngôn ngữ và chuyển đổi bằng cách viết mã. Tuy nhiên, cách này có một số hạn chế như kết quả hiển thị không đúng (do độ dài xâu ở các ngôn ngữ khác nhau), không tổng quát cho các điều khiển.

.NET hỗ trợ đa ngôn ngữ ngay từ nền tảng, các chương trình viết trên nền .NET có khả năng chuyển đổi ngôn ngữ trong khi chạy một cách dễ dàng. Đặc tính này của .NET được nhắc đến không nhiều trong các tài liệu, và chúng ta thường không để ý đến cho tới khi có nhu cầu.

Trước tiên, cần phải hiểu giao diện ở đây bao gồm:

  • Tiêu đề hiển thị trên các cửa sổ và các điều khiển trong cửa sổ.
  • Các thông báo của chương trình dùng MessageBox.

Giao diện không bao gồm nội dung dữ liệu hiển thị.

Một chương trình khi đã dự định hỗ trợ nhiều ngôn ngữ, cần phải lưu ý một số điểm sau:

  • KHÔNG BAO GIỜ viết trực tiếp một xâu ký tự trong mã nguồn chương trình. Các xâu ký tự trong mã nguồn sẽ không thể chuyển đổi được sang ngôn ngữ khác trong khi chạy. Các xâu ký tự cần được đặt trong các tài nguyên của chương trình.
  • Nên chọn một ngôn ngữ ngầm định (tiếng Anh) khi phát triển chương trình. Việc chuyển đổi ngôn ngữ được thực hiện cuối cùng, khi các chức năng của chương trình đã hoàn tất.

Mô hình mà Microsoft đưa ra, đó là với mỗi cửa sổ sẽ gồm các phần:

  • Tệp chứa mã do người dùng soạn thảo.
  • Tệp chứa mã sinh bởi trình thiết kế.
  • Các tệp tài nguyên cửa sổ, chứa hình ảnh, xâu ký tự… sử dụng trong cửa sổ.

Ứng với mỗi ngôn ngữ hiển thị, có một tệp tài nguyên tương ứng. Khi dịch, các tài nguyên này được đưa vào trong tệp đã dịch (exe, dll), dựa vào ngôn ngữ được lựa chọn mà tài nguyên tương ứng sẽ được sử dụng để hiển thị.

Bài này giới thiệu một chương trình hỗ trợ hai ngôn ngữ hiển thị là tiếng Anh và tiếng Việt, có chuyển đổi ngôn ngữ trong khi chạy. Chương trình mẫu có tên LocalizationDemo, viết bằng ngôn ngữ C#, trên nền Visual Studio 2005. Sau đây là một số kỹ thuật chính khi xây dựng chương trình.

Thêm giao diện tiếng việt cho một cửa sổ

Khi thiết kế cửa sổ, chúng ta sử dụng ngôn ngữ ngầm định là tiếng Anh.

Hình 1 – Giao diện cửa sổ với ngôn ngữ ngầm định.

Để thêm giao diện tiếng việt cho cửa sổ, đặt thuộc tính Language của cửa sổ là Vietnamese, LocalizableTrue.

Hình 2 – Đặt các thuộc tính Language và Localizable cho cửa sổ.

Sau khi đặt các thuộc tính trên, cửa sổ đang thiết kế trông không có gì thay đổi, nhưng thực ra là Form Designer đã tạo ra một giao diện mới dựa trên giao diện đã có.

Sửa đổi toàn bộ giao diện mới của cửa sổ sang tiếng Việt.

Hình 3: Giao diện cửa sổ với ngôn ngữ Tiếng Việt.

Thêm mục Setting cho ngôn ngữ

Để chuyển đổi được ngôn ngữ, chương trình cần phải khởi động lại nên chúng ta cần lưu lại ngôn ngữ được chọn ở lần chạy trước đó.

Thêm vào Settings một mục kiểu string, tên Language, giá trị ngầm định là en-US.

Hình 3 – Thêm mục Language trong Settings của chương trình

Thêm lệnh chuyển đổi ngôn ngữ hiển thị

Lệnh chuyển đổi ngôn ngữ phải được thực hiện trước khi cửa sổ chính được tạo ra. Mở tệp Program.cs và sửa lại phương thức Main như sau:

Xử lý sự kiện Click với hai mục English và Vietnamese trên trình đơn:

Đến đây, chương trình đã có thể chuyển đổi ngôn ngữ trong khi chạy. Để ngôn ngữ được lựa chọn có thể hiển thị được, cần phải khởi động lại chương trình sau khi chọn.

Chuyển đổi ngôn ngữ các thông báo dùng MessageBox

Để có thể chuyển đổi ngôn ngữ đối với các thông báo dùng MessageBox, các xâu ký tự cần phải được đặt trong các tệp tài nguyên.

  • Thêm vào dự án một Resources File và đặt tên là Resources.vi.resx.
  • Kéo tệp vừa thêm và thả vào mục Properties của dự án.

Hình 4 – Tệp Resources.vi.resx trong mục Properties

Tệp Resources.resx dùng để chứa các xâu ký tự trên ngôn ngữ ngầm định, tệp Resources.vi.resx dùng để chứa các xâu ký tự theo ngôn ngữ Tiếng Việt.

Thêm vào các tệp Resources các xâu ký tự, ở cả hai ngôn ngữ:

Hình 5 – Các xâu ký tự trên ngôn ngữ ngầm định

Hình 6 – Các xâu ký tự Tiếng Việt

Khi đưa ra thông báo, truy cập các xâu ký tự thông qua lớp Properties.Resources.

Ví dụ, để thông báo yêu cầu khởi động lại chương trình sau khi chuyển ngôn ngữ, sửa đổi các phương thức xử lý sự kiện như sau:

Download:

Mã nguồn chương trình (zip).

Sử dụng DLL trong .NET

Posted in Visual C++, Visual Studio 2005, Windows API on Tháng Tư 20, 2007 by Phạm Quang Hoà

Trong các chương trình viết trên nền .NET, ngoài việc sử dụng bộ thư viện được cung cấp bởi .NET Framework, đôi khi chúng ta có nhu cầu sử dụng các hàm được viết trên nền Windows, như các hàm API của Windows. Thông thường, các hàm này được cài đặt trong các thư viện liên kết động (DLL), được dịch bằng một trình dịch nào đó như MS Visual C++ hay Borland Delphi.

Các thư viện khi phát hành thường gồm 3 tệp, tệp tiêu đề có phần mở rộng .h chứa khai báo các hàm, tệp thư viện nhập có phần mở rộng .lib và tệp thư viện liên kết động có phần mở rộng .dll.

Để sử dụng các hàm của thư viện liên kết động trong .NET, chỉ cần tệp .dll là đủ, ngoài ra còn cần tệp .h để biết nguyên mẫu các hàm, từ đó khai báo các hàm trong .NET một cách đúng đắn.

Trong bài này, tôi giới thiệu cách sử dụng các hàm viết trong một thư viện liên kết động, được dịch bằng Visual C++ trong một chương trình viết trên nền .NET. Thư viện minh hoạ trong bài học này là thư viện đã được giới thiệu trong bài Thư viện liên kết động, môn học Lập trình Windows. Đây là một thư viện đơn giản với hai hàm: hàm tính luỹ thừa và hàm tính giai thừa.

Tệp tiêu đề của thư viện được khai báo như sau:
/* MyDll.h */
#ifndef __MYDLL_H__
#define __MYDLL_H__

#ifdef MYDLL_EXPORTS
#define MYDLLEXPORT _declspec(dllexport)
#else
#define MYDLLEXPORT _declspec(dllimport)
#endif

MYDLLEXPORT LONG CALLBACK Factorial(UINT);
MYDLLEXPORT DOUBLE CALLBACK Power(DOUBLE, UINT);

#endif // __MYDLL_H__

Tệp nguồn của thư viện:

/* MyDll.c */
#include
#include “MyDll.h”

LONG CALLBACK Factorial(UINT n)
{
  return (n > 0)?n*Factorial(n – 1):1;
}

DOUBLE CALLBACK Power(DOUBLE x, UINT n)
{
  return (n > 0)?x*Power(x, n – 1): 1;
}

Để sử dụng thư viện này trong .NET, dùng khai báo hàm với từ khoá extern và thuộc tính DllImport. Chương trình sau sẽ khai báo và sử dụng hai hàm này.

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace UsingDll {
  class Program {
    [DllImport("MyDll.dll")]
    private static extern int Factorial(int n);

    [DllImport("MyDll.dll")]
    private static extern double Power(double x, int n);

    static void Main(string[] args) {
      Console.WriteLine(“2.0 to power 3 is {0}”,
        Power(2.0, 3));
      Console.WriteLine(“Factorial of 5 is {0}”,
        Factorial(5));
    }
  }
}

Một trong những vấn đề thường gặp phải khi sử dụng hàm viết trên nền Windows trong .NET là kiểu dữ liệu giữa hai nền không giống nhau. Sau đây là một vài kiểu chuyển đổi để có thể gọi hàm một cách đúng đắn.

Kiểu số nguyên 1 byte:
Windows: TCHAR (char), BYTE (unsigned char).
.NET: sbyte, byte (C#), Byte (VB.NET).

Kiểu số nguyên 4 byte:
Windows: int, UINT (unsigned int), DWORD (unsigned int), LONG (long).
.NET: int (C#), Integer (VB.NET) hoặc Int32.

Kiểu số thực 4 byte:
Windows: float.
.NET: float (C#), Single (VB.NET)

Kiểu số thực 8 byte:
Windows: double.
.NET: double (C#), Double (VB.NET).

Kiểu xâu ký tự (vào):
Windows: LPCTSTR, LPSTR.
.NET: string (C#), String (VB.NET).

Kiểu xâu ký tự (ra):
Windows: LPSTR.
.NET: byte[], sbyte[] (C#), Byte [] (VB.NET)

Download:

Ghi chú:
- Các hàm trong DLL phải được dịch theo chế độ gọi stdcall. Để dịch theo chế độ stdcall, các hàm nên khai báo với chỉ thị _stdcall (WINAPI, CALLBACK) và đặt các tệp nguồn có phần mở rộng là .c. Để kiểm tra một hàm trong một DLL có sẵn có phải được gọi theo kiểu stdcall không, mở DLL và xem định dạng của hàm trong DLL phải có dạng _<Tên hàm>@<Độ dài tham số>. Ví dụ hai hàm trên sẽ có tên đầy đủ là: _Factorial@4 và _Power@12.

- Trong trường hợp lấy xâu ký tự ra từ hàm, cần phải truyền vào một mảng kiểu byte (ANSI) hoặc char (Unicode) đủ lớn, sau đó ghép các ký tự nhận được trong mảng để tạo thành xâu ký tự kiểu string.