1. Trang chủ
  2. » Công Nghệ Thông Tin

Sử dụng DLL trong net

4 483 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Sử dụng dll trong .net
Trường học University of Information Technology
Chuyên ngành Lập trình Windows
Thể loại Bài viết
Năm xuất bản 2007
Thành phố Hồ Chí Minh
Định dạng
Số trang 4
Dung lượng 31,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Sử dụng DLL trong net

Trang 1

SỬ DỤNG DLL TRONG NET

14/06/2007 04:49 PM

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

Trang 2

#ifdef MYDLL_EXPORTS

#define MYDLLEXPORT _declspec(dllexport)

#else

#define MYDLLEXPORT _declspec(dllimport)

#endifMYDLLEXPORT 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 {

Trang 3

[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

Trang 4

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)

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.

Ngày đăng: 14/11/2012, 17:19

TỪ KHÓA LIÊN QUAN

w