API là gì nói một cách đơn giản. API: nó là gì - mô tả và các loại API. API giúp cuộc sống của nhà phát triển dễ dàng hơn



API - nó là gì? Giải mã, định nghĩa, dịch thuật

API là tên viết tắt tiếng Anh, Viết tắt của MỘTứng dụng P lập trình TÔI ninterface - “Giao diện lập trình ứng dụng”. Thông thường, API là một tập hợp các chức năng tiện lợi cho phép bạn truy cập một dịch vụ và yêu cầu dữ liệu từ dịch vụ đó. Trong tiếng Anh, từ viết tắt này được phát âm là “hey-pi-ay”, nhưng các lập trình viên nói tiếng Nga không làm phức tạp cuộc sống của họ một cách không cần thiết và nói “ápi”.

Một ví dụ cổ điển về API là Yandex.maps: bất kỳ lập trình viên hoặc quản trị viên web nào ít nhiều kinh nghiệm đều có thể đặt bản đồ Yandex của bất kỳ thành phố hoặc làng nào với các cài đặt anh ta cần trên trang web của mình, sử dụng các chức năng API tiện lợi, nhân tiện, là được Yandex cung cấp hoàn toàn miễn phí và bao gồm gần như toàn bộ bộ cài đặt bản đồ có sẵn cho người dùng trang web Yandex.Maps.




Bạn có tìm ra từ này đến từ đâu không? API, lời giải thích bằng từ ngữ đơn giản, bản dịch, nguồn gốc và ý nghĩa.

API(Tiếng Anh) Giao diện lập trình ứng dụng) - đây là giao diện lập trình ứng dụng. API của một ứng dụng hoặc dịch vụ cụ thể cung cấp một tập hợp các quy trình, hàm và biến được tạo sẵn để các nhà phát triển bên thứ ba có thể tạo các ứng dụng và tập lệnh của riêng họ để hoạt động với dịch vụ này.

Khi làm việc thông qua API, ứng dụng sẽ gửi yêu cầu đến một dịch vụ và nhận được phản hồi chứa dữ liệu được yêu cầu, bất kể nó được tạo bằng ngôn ngữ lập trình nào.

Chủ sở hữu các cửa hàng trực tuyến, sử dụng dịch vụ của bên thứ ba và ứng dụng của riêng họ, có cơ hội truy cập qua API:

Thông tin về đơn hàng đã đặt

Các hành động (phương thức) có sẵn để xử lý thông tin đơn hàng:

  1. Lựa chọn thông tin đơn hàng theo ID
  2. Lựa chọn thông tin đơn hàng theo bộ lọc
  3. Số lượng đơn hàng theo bộ lọc
  4. Tạo đơn hàng
  5. Xóa đơn hàng
  6. Xóa đơn hàng loạt
  7. Chọn tất cả các trạng thái có sẵn cho đơn hàng
  8. Cập nhật trạng thái đơn hàng
  9. Thêm một bình luận vào một đơn đặt hàng

Thông tin thuê bao

  1. Thêm người đăng ký
  2. Xóa người đăng ký
  3. Xóa hàng loạt người đăng ký
  4. Chọn dữ liệu thuê bao theo bộ lọc
  5. Số lượng người đăng ký theo bộ lọc

Thông tin về người dùng đã đăng ký

Các hành động (phương thức) sẵn có để xử lý thông tin về người đăng ký:

  1. Lựa chọn thông tin người dùng đã đăng ký theo ID
  2. Lựa chọn thông tin về tất cả người dùng đã đăng ký
  3. Lựa chọn thông tin về toàn bộ dữ liệu do người dùng chỉ định trong quá trình đăng ký:
    • Họ và tên;
    • Địa chỉ email liên hệ;
    • Số điện thoại liên hệ;
    • Địa chỉ giao hàng cụ thể: mã zip, tên địa phương, tên đường, số nhà, số tòa nhà, số căn hộ, tầng;

Ghi chú! Khi đăng ký, người dùng có thể không hoàn thành tất cả các trường trên.

Kế hoạch phát triển API

Trong thời gian tới, chúng tôi dự định mở các giao diện hỗ trợ tương tác giữa các cửa hàng với các ứng dụng và dịch vụ của bên thứ ba để làm việc với:

  1. Các phần danh mục.
  2. Các mặt hàng.
  3. Một chiếc giỏ.
  4. Giảm giá.
  5. Phương thức giao hàng.
  6. Phương thức thanh toán.

Để kiểm tra khả năng tương tác với API nền tảng beseller, một cửa hàng thử nghiệm beseller-api.shop.by đã được tạo.

Để truy cập cửa hàng thử nghiệm, bạn phải cung cấp thông tin đăng nhập và mật khẩu. Bạn có thể lấy chúng theo yêu cầu từ người quản lý cá nhân của bạn.

Trước khi thử nghiệm khả năng tương tác với API, chúng tôi khuyên bạn nên:

  1. tự mình đặt một số đơn hàng;
  2. Đăng ký nhận bản tin;
  3. xem thông tin về đơn hàng đã đặt và người đăng ký được hiển thị như thế nào trong bảng quản trị cửa hàng.

Bảng điều khiển cửa hàng có sẵn tại: beseller-api.shop.by/manager/. Thông tin đăng nhập và mật khẩu khi vào bảng điều khiển tương tự như thông tin đăng nhập và mật khẩu để truy cập cửa hàng.

Làm cách nào để kết nối qua API với cửa hàng của bạn?

Để kết nối ứng dụng với cửa hàng của bạn, bạn cần chỉ định URL truy cập API có dạng:

http://your_site_address:8082/graphql?token=your_personal_secret_key

Bạn có thể lấy khóa bí mật theo yêu cầu từ người quản lý cá nhân của bạn.

Các hàm và biến GraphQL để làm việc với API nền tảng beseller

Cách kết nối với API bằng ngôn ngữ lập trình PHP

Để làm việc với API nền tảng beseller dễ dàng hơn, bạn có thể sử dụng:

  1. Các lớp do chúng tôi phát triển cho PHP.
    1. GraphqlClient- nhận và truyền dữ liệu đến máy chủ;
    2. Trình trợ giúp đồ thịQl- chứa các API truy vấn và đột biến được triển khai;
  2. Ví dụ về việc sử dụng các lớp để thực hiện lựa chọn và thay đổi trong cơ sở dữ liệu cửa hàng trực tuyến.

Thiết lập môi trường cục bộ của bạn

Để thể hiện rõ ràng việc gửi yêu cầu tới API và phản hồi nhận được, bạn có thể sử dụng môi trường cục bộ.

GraphiQL Feen được sử dụng làm môi trường cục bộ, đây là tiện ích mở rộng dành cho trình duyệt Google Chrome cho phép bạn tạo yêu cầu tới API.

Sau khi cài đặt ứng dụng, một biểu tượng ứng dụng sẽ xuất hiện trên trình duyệt của bạn gần thanh địa chỉ.

Mở ứng dụng GraphiQL Feen và chuyển đến tab “SERVERS”, chọn phương thức gửi POST, sau đó chỉ định url truy cập API.

Địa chỉ sau sẽ được sử dụng làm url kiểm tra:

Môi trường cục bộ được định cấu hình, bạn có thể tạo yêu cầu tới API. Để thực hiện việc này, bạn cần mở tab “QUERIES”

Tạo yêu cầu tới API của người bán bằng cách sử dụng GraphiQL Feen và nhận được phản hồi

Giải thích cho ảnh chụp màn hình:

  1. Truy vấn đã lưu
  2. Trường để nhập yêu cầu
  3. Trường đầu vào có thể thay đổi
  4. Đáp ứng nhận được
  5. Nút bắt đầu

Ví dụ về yêu cầu lấy danh sách các đơn hàng đã đặt trong một khoảng thời gian xác định

truy vấn ($first:Int, $offset:Int, $filter: OrderFilterType)(
đơn hàng(first:$first, offset:$offset, filter:$filter)(
bình luận
trạng thái(
nhận dạng
Sự miêu tả
tên
}
tạo_ngày
cập nhật ngày tháng
tổng cộng (
hậu tố
giá trị
}
sự chi trả (
tên
Sự miêu tả
trị giá (
hậu tố
giá trị
}
}
vận chuyển (
tên
Sự miêu tả
trị giá (
hậu tố
giá trị
}
}
tiền tệ (
Mã ngân hàng
khóa học
hậu tố
}
dữ liệu người dùng(
tên
Sự miêu tả
giá trị
}
}
}

Chỉ định khoảng thời gian truy xuất dữ liệu về các đơn hàng đã đặt

{
"lọc": (
"date_after": "2017-11-16T00:00:01Z",
"ngày_trước": "23-11-11-201000:00:01Z"
}
}

Phản hồi mẫu từ API

{{
"dữ liệu": (
"đơn đặt hàng": [
{
"comment": "Culpa officis vel ut.",
"create_date": "22-11-2017 16:23:28",
"tiền tệ": [
{
"bank_code": "BYN",
"khóa học": 10000,
"hậu tố": "chà."
}
],
"vận chuyển": (
"trị giá": [
{
"hậu tố": "chà.",
"giá trị": 0
}
],
"mô tả": "Chuyển phát nhanh",
"tên": "tùy chỉnh"
},
"sự chi trả": (
"trị giá": [
{
"hậu tố": "chà.",
"giá trị": 0
}
],
"description": "Thẻ nhựa",
"tên": "tùy chỉnh"
},
"trạng thái": (
"mô tả": "Mới",
"id": 1,
"tên": "mới"
},
"tổng cộng": [
{
"hậu tố": "chà.",
"giá trị": 4450
}
],
"update_date": "22-11-2017 16:23:28",
"dữ liệu người dùng": [
{
"description": "Địa chỉ email",
"tên": "email",
"giá trị": " [email được bảo vệ]"
},
{
"mô tả": "Điện thoại",
"tên": "điện thoại",
"giá trị": "784.392.3949 x69329"
},
{
"mô tả": "Địa chỉ",
"tên": "đăng ký",
"value": "607 Erik Station Suite 057\nReynaberg, WY 83542-0037"
},
{
"mô tả": "Nhận xét",
"tên": "bình luận",
"value": "Id nam illo optio."
},
{
"mô tả": "Tên",
"tên": "fio",
"giá trị": "Jordi Mann MD"
}
]
}

API là giao diện bên ngoài để lập trình ứng dụng, truy cập các trang web bằng giao thức cụ thể để lấy thông tin và đơn giản hóa việc phát triển các chương trình liên quan đến dịch vụ nội bộ.

API có nghĩa là gì?

Cách tương tự đơn giản nhất khi sử dụng API là sử dụng máy tính để thực hiện các phép tính phức tạp. Giả sử bạn có một nhiệm vụ, bạn có thể hiểu bản chất của nó, xây dựng phương trình và đồ thị, nhưng bạn không biết cách thực hiện các phép tính số học với các con số. Có một máy tính bên cạnh bạn có thể thực hiện các thao tác này một cách dễ dàng. Bạn không biết chuyện gì đang xảy ra bên trong máy tính và bạn cũng không cần phải biết. Bạn cung cấp thông tin dưới một hình thức và nhận thông tin dưới một hình thức khác, cần thiết cho mục đích của bạn.

Bất kỳ API nào cũng hoạt động theo nguyên tắc này. Bạn không quan tâm chương trình nhận được câu trả lời như thế nào, yêu cầu đi theo đường dẫn nào bên trong nó, cách thực hiện các phép tính. Bạn chỉ chắc chắn một điều - để đáp lại, thông tin tiêu chuẩn sẽ được cung cấp về sự thành công của hoạt động hoặc lỗi của nó.

Giao diện API cho phép bạn không lãng phí thời gian, tiền bạc và công sức khi mua một chiếc “chiếc xe đạp mới”. Bạn nhận được một cổng thông tin hoạt động nhận và gửi lượng dữ liệu cần thiết cho mục đích phát triển của bạn.

Ưu điểm:

  • Tiết kiệm để phát triển giao diện của riêng bạn.
  • Không cần thiết phải hiểu các sắc thái của vấn đề.
  • API được phát triển bởi các chuyên gia và tính đến tất cả các yếu tố của quy trình nội bộ mà bạn có thể không biết khi tạo giải pháp của mình.
  • Cho phép bạn liên lạc với các dịch vụ được đóng thông qua các giao thức khác.

Nhược điểm:

  • Nếu dịch vụ mục tiêu được cập nhật, API không phải lúc nào cũng nhận được đầy đủ chức năng ngay lập tức.
  • Bạn không thể bắt lỗi và không biết quy trình hoạt động như thế nào trong mã của người khác.
  • API không phải lúc nào cũng mang lại kết quả tối ưu nhất về mặt thời gian, vì nó được thiết kế để xử lý các trường hợp chung chứ không phải trường hợp cụ thể.

Ví dụ về API

Tích hợp API là quá trình kết nối ứng dụng với giao diện dữ liệu bên ngoài. Làm việc với API bắt đầu bằng việc nghiên cứu tài liệu và giao thức được sử dụng, sau đó tích hợp trực tiếp chương trình của bạn vào giao diện. Hãy xem xét các dịch vụ phổ biến nhất có API riêng.

VKAPI

Giao diện bên ngoài để tương tác của mạng xã hội phổ biến VKontakte với khách hàng, cũng như với các ứng dụng trình duyệt và máy chủ. Cho phép bạn quản lý tin nhắn cộng đồng, bìa nhóm, trang người dùng nếu bạn có khóa truy cập phù hợp.

Tất cả các yêu cầu được gửi đến địa chỉ https://api.vk.com/method/

Sau dấu gạch chéo là tên của phương thức API được sử dụng và các tham số GET của yêu cầu được truyền đi. Phản hồi cũng đến qua HTTPS ở định dạng JSON.

API BOT ĐIỆN THOẠI

Một trong những API phổ biến nhất. Nó được sử dụng để điều khiển bot trong trình nhắn tin Telegram. Sau khi tạo bot thông qua @botfather và nhận được các khóa truy cập cần thiết, bạn có thể bắt đầu tương tác với phần phụ trợ.

Yêu cầu có thể được thực hiện để: https://api.telegram.org/bot0000000:token/

Trong đó bot0000000 được thay thế bằng mã định danh duy nhất của bot của bạn và mã thông báo biểu thị khóa bí mật.

Yêu cầu được gửi qua kết nối HTTPS, tên phương thức được biểu thị bằng dấu gạch chéo đến địa chỉ chính. Phản hồi có định dạng JSON.

MỞ API BẢN ĐỒ THỜI TIẾT

Thường cần lấy thông tin thời tiết mà không cần sử dụng các vật dụng và ứng dụng trả phí của bên thứ ba. Dịch vụ OpenWeatherMap ra đời với API mở và miễn phí. Sau khi đăng ký và nhận dữ liệu nhận dạng, bạn có thể gửi yêu cầu thời tiết từ các tập lệnh máy chủ trên toàn thế giới. Để phản hồi ID thành phố, tài nguyên sẽ trả về thông tin chi tiết nhất về thời tiết hiện tại và đưa ra dự báo cho tương lai gần.

Định dạng: Truyền HTTP qua api.openweathermap.org/data/2.5/weather?id= cho biết số nhận dạng của thành phố mong muốn. Phản hồi của máy chủ: JSON.

API bản đồ GOOGLE

Điều gì có thể đẹp hơn một bản đồ thế giới tương tác trên một trang web? Đặc biệt nếu đây không phải là mẫu chèn từ Google Maps mà là phiên bản cá nhân của bạn về một bản đồ phổ biến với các cụm điểm đánh dấu cá nhân. Bản đồ sẽ tương tác với các tập lệnh khác trên trang web, gửi thông tin về các lần nhấp chuột và tọa độ.

API JavaScript của Google Maps cung cấp các khả năng tương tự. Mô-đun này hoàn toàn được viết theo kịch bản và hoạt động ở phía trình duyệt, vì vậy chúng tôi không cần các yêu cầu HTTP từ PHP và việc hình thành các tiêu đề ở phía máy chủ, như trường hợp của các API khác.

Ví dụ: đặt điểm đánh dấu trên bản đồ sẽ trông như thế này:

var mark = google.maps.Marker mới((
vị trí: myPOS,
bản đồ: bản đồ,
tiêu đề: "Xin chào!"
});

Sự cần thiết và lợi ích của việc sử dụng API là gì?

Có khá nhiều chức năng hữu ích.

Khía cạnh đầu tiên

Bạn có thể thiết lập sự tương tác tương tác của người dùng với mạng xã hội và tin nhắn tức thời, sử dụng khả năng của hệ thống máy tính của bên thứ ba để hiển thị tỷ giá hối đoái, thời tiết và các thông tin quan trọng khác.

Bằng cách sử dụng API, bạn có thể kết nối ngay lập tức các tài nguyên và giải pháp phần mềm khác với máy chủ, việc này thường mất hàng tuần để phát triển. API đơn giản hóa cuộc sống khi không cần triển khai duy nhất và độ tin cậy cũng như bảo mật là ưu tiên hàng đầu.

Khía cạnh thứ hai

Nếu bạn là chủ sở hữu sức mạnh tính toán phức tạp, một dịch vụ phổ biến hoặc bộ lưu trữ dữ liệu để truy cập công khai hoặc bán riêng tư, thì một động thái tốt là nâng cao API của riêng bạn. Nó sẽ mang lại điều gì:

  • Lượng khách hàng lớn.
  • Đơn giản hóa quyền truy cập vào các dịch vụ của bạn cho các đối tác.
  • Thuận tiện cho việc phân tích thống kê việc sử dụng dịch vụ.

Khía cạnh thứ ba

Gần giống như cái thứ hai. Nhưng không cần phải triển khai API truy cập mở. Nếu bạn có một cổng thông tin và muốn tạo một ứng dụng di động cho nó trên Android/IOS thì việc viết lại hệ thống theo một API duy nhất là giải pháp tốt nhất. Toàn bộ cấu trúc dữ liệu được hệ thống hóa. Trang web và ứng dụng sẽ hoạt động thông qua các kênh dữ liệu duy nhất.

Windows API - một tập hợp các chức năng của hệ điều hành

API viết tắt có vẻ rất bí ẩn và thậm chí đáng sợ đối với nhiều lập trình viên mới làm quen. Trên thực tế, Giao diện lập trình ứng dụng (API) chỉ là một số bộ chức năng được tạo sẵn mà các nhà phát triển ứng dụng có thể sử dụng. Nói chung, khái niệm này tương đương với cái trước đây thường được gọi là thư viện chương trình con. Tuy nhiên, API thường đề cập đến một danh mục đặc biệt của các thư viện đó.

Trong quá trình phát triển hầu hết mọi ứng dụng khá phức tạp (MyApplication) cho người dùng cuối, một tập hợp các chức năng nội bộ cụ thể sẽ được hình thành để sử dụng để triển khai chương trình cụ thể này, được gọi là API MyApplication. Tuy nhiên, hóa ra những chức năng này thường có thể được sử dụng một cách hiệu quả để tạo ra các ứng dụng khác, bao gồm cả các lập trình viên khác. Trong trường hợp này, các tác giả dựa trên chiến lược quảng bá sản phẩm của mình phải quyết định câu hỏi: họ có mở quyền truy cập vào bộ này cho người dùng bên ngoài hay không? Nếu câu trả lời là có thì cụm từ “Gói bao gồm một bộ chức năng API mở” xuất hiện trong phần mô tả gói phần mềm như một đặc điểm tích cực (nhưng đôi khi để kiếm thêm tiền).

Do đó, thông thường API đề cập đến một tập hợp các chức năng là một phần của một ứng dụng nhưng cũng có sẵn để sử dụng trong các chương trình khác. Ví dụ: Excel, ngoài giao diện người dùng cuối, còn có một bộ hàm API Excel có thể được sử dụng, đặc biệt là khi tạo ứng dụng bằng VB.

Theo đó, API Windows là một tập hợp các chức năng là một phần của chính hệ điều hành, đồng thời có thể truy cập được đối với bất kỳ ứng dụng nào khác, kể cả những ứng dụng được viết bằng VB. Về vấn đề này, sự tương tự với bộ ngắt hệ thống BIOS/DOS, thực ra là một API DOS, là khá hợp lý.

Sự khác biệt là phạm vi chức năng của Windows API một mặt rộng hơn nhiều so với DOS, mặt khác nó không bao gồm nhiều công cụ để quản lý trực tiếp tài nguyên máy tính có sẵn cho các lập trình viên trước đây. hệ điều hành. Ngoài ra, các lệnh gọi tới API Windows được thực hiện bằng cách sử dụng các lệnh gọi thủ tục thông thường và các lệnh gọi tới các hàm DOS được thực hiện thông qua một lệnh bộ xử lý đặc biệt có tên là Ngắt.

Tại sao cần Win API cho lập trình viên VB?

Mặc dù thực tế là VB có rất nhiều chức năng nhưng trong quá trình phát triển ít nhiều nghiêm túc, người ta phát hiện ra rằng khả năng của chúng thường không đủ để giải quyết các vấn đề cần thiết. Đồng thời, những lập trình viên mới vào nghề thường bắt đầu phàn nàn về những thiếu sót của VB và nghĩ đến việc thay đổi công cụ, không hề nghi ngờ rằng máy tính của mình có một bộ công cụ khổng lồ và họ chỉ cần biết cách sử dụng chúng.

Khi làm quen với Win API, người ta phát hiện ra nhiều hàm VB tích hợp không gì khác hơn là gọi đến các thủ tục hệ thống tương ứng mà chỉ được thực hiện dưới dạng cú pháp của một ngôn ngữ nhất định. Khi tính đến điều này, nhu cầu sử dụng API được xác định bằng các tùy chọn sau:

  1. Các hàm API được triển khai đầy đủ dưới dạng các hàm VB tích hợp sẵn. Tuy nhiên, đôi khi trong trường hợp này, việc chuyển sang sử dụng API sẽ rất hữu ích, vì điều này đôi khi có thể cải thiện đáng kể hiệu suất (đặc biệt là do không có các chuyển đổi không cần thiết của các tham số đã truyền).
  2. Các hàm VB tích hợp chỉ triển khai một trường hợp đặc biệt của hàm API tương ứng. Đây là một lựa chọn khá phổ biến. Ví dụ: hàm API CreateDirectory có nhiều khả năng hơn toán tử VB MkDir tích hợp sẵn.
  3. Một số lượng lớn các hàm API hoàn toàn không có chức năng tương tự trong phiên bản hiện tại của ngôn ngữ VB. Ví dụ: bạn không thể xóa thư mục bằng VB - để thực hiện việc này, bạn cần sử dụng hàm DeleteDirectory.

Cũng cần nhấn mạnh rằng một số hàm API (tỷ lệ của chúng trong Win API rất nhỏ) không thể được gọi từ các chương trình VB do một số hạn chế về ngôn ngữ, chẳng hạn như do không thể làm việc với các địa chỉ bộ nhớ. Nhưng trong một số trường hợp, các kỹ thuật lập trình không tầm thường có thể hữu ích (đặc biệt, trong trường hợp có cùng địa chỉ).

Quan điểm cá nhân của tác giả là thế này - thay vì mở rộng các hàm có sẵn của VB từ phiên bản này sang phiên bản khác, cần đưa ra một mô tả hay về các hàm API phổ biến nhất. Đồng thời, tôi khuyên các nhà phát triển không nên chờ đợi phiên bản mới của công cụ với các chức năng mở rộng xuất hiện mà hãy xem xét kỹ hơn thành phần của Win API hiện có - rất có thể các khả năng bạn cần có thể đã được triển khai trong phiên bản VB 1.0, phát hành năm 1991.

Cách tìm hiểu API Win

Đây không phải là một câu hỏi đơn giản, vì số lượng hàm Win32 API ước tính vào khoảng 10 nghìn (không ai biết con số chính xác, kể cả Microsoft).

VB (phiên bản 4-6) bao gồm một tệp mô tả các khai báo Win API - WIN32API.TXT (chúng tôi sẽ cho bạn biết thêm về cách sử dụng nó sau). Tuy nhiên, thứ nhất, với sự trợ giúp của nó, bạn có thể lấy thông tin về mục đích của một hàm cụ thể và các tham số của nó chỉ bằng các tên ghi nhớ được sử dụng và thứ hai, danh sách các hàm trong tệp này vẫn chưa hoàn chỉnh. Có một thời (bảy năm trước), VB 3.0 có các tệp trợ giúp đặc biệt mô tả các chức năng của API Win16. Tuy nhiên, đã có trong phiên bản 4.0, thông tin hữu ích với giao diện tiện lợi này đã biến mất.

Bạn có thể tìm thấy thông tin đầy đủ về API Win32 trong phần trợ giúp của Bộ công cụ phát triển phần mềm nền tảng, được bao gồm trong CD Thư viện MSDN đi kèm với VB 5.0 và 6.0 Enterprise Edition và Office 2000 Developer Edition. Tuy nhiên, việc tìm kiếm những thông tin cần thiết ở đó và hiểu được nó không hề dễ dàng chút nào. Chưa kể rằng tất cả các mô tả ở đó đều liên quan đến ngôn ngữ C.

Sách của chuyên gia nổi tiếng người Mỹ Daniel Appleman được thế giới công nhận rộng rãi về việc học lập trình API trong môi trường VB. Loạt sách Hướng dẫn lập trình viên Visual Basic cho Windows API của Dan Appleman (dành cho Win16, Win32 và các phiên bản khác nhau của VB) là một trong những cuốn sách bán chạy nhất dành cho lập trình viên VB kể từ năm 1993. Cuốn sách Dan Appleman's VB 5.0 Programmer's Guide to the Win32 API, phát hành năm 1997, được một người bạn mang đến từ Mỹ bởi một người bạn tìm thấy nó trong hiệu sách đầu tiên của một thị trấn nhỏ thuộc tỉnh lẻ.

Cuốn sách này dài hơn 1.500 trang, bao gồm các kỹ thuật lập trình API chung trong VB, cũng như hơn 900 hàm. Đĩa CD đi kèm chứa toàn bộ nội dung của cuốn sách và tất cả các ví dụ về chương trình cũng như một số chương bổ sung không có trong phiên bản in. Năm 1999, Dan Appleman phát hành một cuốn sách mới, Sách giải đố API Win32 của Dan Appleman và Hướng dẫn dành cho lập trình viên Visual Basic, bao gồm thông tin về 7.600 chức năng khác (mặc dù không rộng bằng).

Giành được API và Thư viện liên kết động (DLL)

Bộ Win API được triển khai dưới dạng DLL động. Tiếp theo, chúng ta sẽ thực sự nói về công nghệ sử dụng DLL trong môi trường VB bằng ví dụ về các thư viện có trong Win API. Tuy nhiên, khi nói về DLL, có một số điểm quan trọng cần thực hiện.

Trong trường hợp này, khi nói đến DLL, chúng tôi muốn nói đến phiên bản truyền thống của thư viện động nhị phân, cung cấp cho ứng dụng quyền truy cập trực tiếp vào các thủ tục cần thiết - các chương trình con hoặc hàm (theo cách tương tự như những gì xảy ra khi gọi các thủ tục bên trong dự án VB). Các thư viện như vậy có thể được tạo bằng các công cụ khác nhau: VC++, Delphi, Fortran, ngoại trừ VB (hãy xem những gì xuất hiện trong phiên bản 7.0) - phiên bản sau chỉ có thể tạo các DLL ActiveX, được truy cập thông qua giao diện OLE Automation.

Thông thường, các tệp thư viện động có phần mở rộng .DLL, nhưng điều này hoàn toàn không cần thiết (đối với Win16, phần mở rộng .EXE thường được sử dụng); trình điều khiển thiết bị bên ngoài được chỉ định bằng .DRV.

Như chúng tôi đã lưu ý, khá khó để xác định chính xác số lượng hàm Windows API và các tệp chứa chúng, nhưng tất cả chúng đều nằm trong thư mục hệ thống. Về vấn đề này, tốt hơn là nên làm nổi bật thành phần của các thư viện có trong nhân hệ điều hành và các thư viện chính với các chức năng bổ sung chính.

Và bây giờ là một số lời khuyên.

Mẹo 1. Đảm bảo quảng cáo DL của bạn được định dạng chính xác thủ tục L

Lệnh gọi các thủ tục DLL trong một chương trình trông giống hệt như các thủ tục Visual Basic “thông thường”, ví dụ:

Gọi DllName([danh sách đối số])

Tuy nhiên, để sử dụng các hàm DLL bên ngoài (bao gồm Win API), chúng phải được khai báo trong chương trình bằng câu lệnh Declare, trông giống như sau:

Khai báo Sub ProcessName Lib _ “LibraryName” _ [([ArgumentList])]

Khai báo hàm FunctionName _ Lib “LibraryName” _ [([ArgumentList])]

Ở đây, các phần tử tùy chọn của toán tử được hiển thị trong dấu ngoặc vuông, biểu thức biến được in nghiêng và các từ còn lại là từ khóa. Hệ thống trợ giúp đưa ra mô tả khá tốt về cú pháp của toán tử, vì vậy hiện tại chúng ta sẽ chỉ lưu ý một số điểm.

Các khai báo về các chức năng bên ngoài nên được đặt trong phần Khai báo chung của mô-đun. Nếu bạn đặt nó trong mô-đun biểu mẫu thì bạn phải chỉ định từ khóa Riêng tư (khai báo này sẽ chỉ có trong mô-đun này) - đây là một hạn chế đối với tất cả các thủ tục mô-đun biểu mẫu.

Bộ API Win32 chỉ được triển khai ở dạng hàm (API Win16 có nhiều thói quen phụ). Trong hầu hết các trường hợp, đây là các hàm thuộc loại Dài, thường trả về mã hoàn thành của thao tác.

Toán tử Khai báo đã xuất hiện trong MS Basic từ thời DOS và nó cũng được sử dụng để khai báo các thủ tục dự án nội bộ. Trong Visual Basic, điều này là không bắt buộc, vì việc khai báo các thủ tục nội bộ tự động là khai báo Phụ hoặc Hàm của chúng. So với Basic/DOS, mô tả mới phải cho biết tên của tệp thư viện chứa thủ tục được yêu cầu. Thư viện Wip API nằm trong thư mục hệ thống Windows nên chỉ cần cung cấp tên tệp là đủ. Nếu bạn đang truy cập một DLL nằm ở một vị trí ngẫu nhiên, bạn cần ghi lại đường dẫn đầy đủ đến tệp này.

Phần mô tả của câu lệnh Declare thường chiếm khá nhiều không gian và không vừa trên một dòng trong cửa sổ mã. Do đó, chúng tôi khuyên bạn nên tuân thủ sơ đồ ngắt dòng cụ thể khi viết ứng dụng, ví dụ:

Khai báo hàm GetTempPath _ Lib “kernel32” Bí danh “GetTempPathA” _ (ByVal nBufferLength As Long, _ ByVal lpBuffer As String) As Long

Trong trường hợp này, tất cả các yếu tố chính của mô tả được đặt trên các dòng khác nhau và do đó rất dễ đọc.

Mẹo 2: Đặc biệt cẩn thận khi làm việc với các hàm DLL

Việc sử dụng Win API và các hàm DLL khác nhau giúp mở rộng đáng kể chức năng của VB và thường cải thiện hiệu suất chương trình. Tuy nhiên, cái giá phải trả cho điều này là nguy cơ làm giảm độ tin cậy của ứng dụng, đặc biệt là trong quá trình gỡ lỗi.

Một trong những ưu điểm quan trọng nhất của môi trường VB là độ tin cậy của quá trình phát triển chương trình: hoạt động dưới sự điều khiển của trình thông dịch, về mặt lý thuyết, mã chương trình không thể làm gián đoạn hoạt động của chính Windows và VB. Lập trình viên có thể không cẩn thận lắm về tính chính xác của việc truyền tham số cho các hàm được gọi - những lỗi như vậy sẽ dễ dàng được phát hiện bởi chính trình thông dịch trong quá trình dịch mã hoặc trong quá trình thực thi mã. Trong trường hợp khó chịu nhất, chế độ xử lý sẽ bị gián đoạn, kèm theo dấu hiệu cho biết lỗi xảy ra ở đâu và tại sao.

Việc sử dụng các hàm API của Windows hoặc các tệp DLL khác sẽ trực tiếp loại bỏ quyền kiểm soát đó đối với việc truyền dữ liệu và quá trình thực thi mã bên ngoài môi trường VB. Vì vậy, lỗi truy cập các chức năng bên ngoài có thể dẫn đến không hoạt động được cả VB và hệ điều hành. Điều này đặc biệt đúng ở giai đoạn phát triển chương trình, khi việc xuất hiện lỗi là điều khá tự nhiên. Do đó, bằng cách sử dụng các khả năng rộng hơn của các chức năng của lớp cơ sở của hệ thống, người lập trình có trách nhiệm sử dụng chúng một cách chính xác.

Vấn đề càng trở nên trầm trọng hơn bởi thực tế là các ngôn ngữ lập trình khác nhau sử dụng các cách khác nhau để truyền tham số giữa các quy trình. (Chính xác hơn, các phương thức truyền khác nhau được sử dụng theo mặc định, vì nhiều ngôn ngữ có thể hỗ trợ nhiều phương thức.) API Win được triển khai trong C/C++ và sử dụng các quy ước truyền tham số C/C++ khác với phiên bản VB thông thường.

Về vấn đề này, cần lưu ý rằng sự xuất hiện của các chức năng tương tự của các hàm API được tích hợp trong VB được chứng minh chính xác bằng cách điều chỉnh cái sau theo cú pháp VB và triển khai cơ chế kiểm soát trao đổi dữ liệu thích hợp. Chúng tôi cũng lưu ý rằng ở giai đoạn thử nghiệm gỡ lỗi ứng dụng khi tạo mô-đun thực thi, tốt hơn là sử dụng tùy chọn biên dịch mã P thay vì Mã gốc (mã máy). Trong trường hợp đầu tiên, chương trình sẽ chạy dưới sự điều khiển của trình thông dịch - chậm hơn so với mã máy, nhưng đáng tin cậy hơn về mặt tác động sai sót có thể xảy ra đối với hệ điều hành và cung cấp chế độ thuận tiện hơn để xác định các lỗi có thể xảy ra.

Mẹo 3: Mười lời khuyên của Dan Appleman để lập trình API mạnh mẽ trong VB

Việc sử dụng hàm API yêu cầu lập trình cẩn thận hơn bằng cách sử dụng một số kỹ thuật gọi thủ tục ít quen thuộc hơn (so với VB). Chúng tôi sẽ tiếp tục giải quyết những vấn đề này ở phần sau. Và bây giờ chúng tôi trình bày bản tóm tắt lời khuyên do Dan Appleman đưa ra về chủ đề này (phiên bản đầu tiên của họ xuất hiện vào năm 1993) cùng với một số bổ sung và nhận xét của chúng tôi.

1. Hãy nhớ ByVal. Lỗi phổ biến nhất mắc phải khi truy cập các hàm API và DLL là sử dụng sai từ khóa ByVal: họ quên đặt hoặc ngược lại, đặt khi không cần thiết.

Những ví dụ này cho thấy tác động của toán tử ByVal đối với việc truyền tham số

Loại tham số Với ByVal Không có ByVal
số nguyên Một số nguyên 16 bit được đẩy vào ngăn xếp Địa chỉ 32 bit của số nguyên 16 bit được đẩy vào ngăn xếp
Dài Một số nguyên 32 bit được đẩy vào ngăn xếp Địa chỉ 32 bit của số nguyên 32 bit được đẩy vào ngăn xếp
Sợi dây Chuỗi được chuyển đổi sang định dạng được sử dụng trong C (dữ liệu và byte rỗng kết thúc). Địa chỉ 32 bit của dòng mới được đẩy lên ngăn xếp Tay cầm VB cho chuỗi được đẩy vào ngăn xếp. (Các thẻ điều khiển như vậy không bao giờ được chính API Windows sử dụng và chỉ được nhận dạng trong các tệp DLL được triển khai riêng cho VB.)

Ở đây cần nhắc lại rằng việc truyền tham số trong bất kỳ hệ thống lập trình nào, kể cả VB, được thực hiện theo hai cách chính: theo tham chiếu (ByRef) hoặc theo giá trị (ByVal). Trong trường hợp đầu tiên, địa chỉ của biến được truyền (tùy chọn này được sử dụng theo mặc định trong VB), trong trường hợp thứ hai - giá trị của nó. Sự khác biệt cơ bản là khi sử dụng tham chiếu, giá trị đã thay đổi của tham số đã truyền sẽ được trả về chương trình gọi.

Để hiểu điều này, hãy tiến hành một thí nghiệm bằng các chương trình sau:

Dim v As Integer v = 2 Gọi MyProc(v) MsgBox “v = “ & v Sub MyProc (v As Integer) v = v + 1 End Sub

Khi chạy ví dụ này, bạn sẽ nhận được một thông báo có giá trị biến bằng 3. Thực tế là trong trường hợp này, địa chỉ của biến v, được tạo vật lý trong chương trình gọi, được chuyển đến chương trình con MyProc. Bây giờ thay đổi mô tả thủ tục thành

Sub MyProc (ByVal v As Integer)

Kết quả là, khi thực hiện kiểm tra, bạn sẽ nhận được v = 2, vì chỉ giá trị ban đầu của biến được chuyển cho thủ tục - kết quả của các thao tác được thực hiện trên nó không được trả về chương trình gọi. Chế độ truyền theo giá trị cũng có thể được thay đổi bằng cách sử dụng toán tử Cuộc gọi như sau:

Sub MyProc (v As Integer) ... Gọi MyProc((v)) ‘ (v) - dấu ngoặc đơn biểu thị chế độ truyền theo giá trị.

Tuy nhiên, khi truy cập các thủ tục VB nội bộ, việc sử dụng từ khóa ByVal trong câu lệnh Gọi bị cấm - thay vào đó, các dấu ngoặc đơn được sử dụng. Có một lời giải thích cho việc này.

Trong trường hợp cổ điển (C, Fortran, Pascal), sự khác biệt giữa chế độ ByRef và ByVal phụ thuộc vào chính xác những gì được đặt trên ngăn xếp trao đổi dữ liệu - địa chỉ của biến hoặc giá trị của nó. Về mặt lịch sử, Basic sử dụng một biến thể của mô phỏng phần mềm ByVal - luôn có một địa chỉ trên ngăn xếp, nhưng chỉ khi truyền theo giá trị, một biến tạm thời mới được tạo cho việc này. Để phân biệt giữa hai tùy chọn này (Cổ điển và Cơ bản), các cách mô tả chế độ ByVal khác nhau được sử dụng. Lưu ý rằng việc mô phỏng chế độ ByVal trong VB mang lại độ tin cậy của chương trình cao hơn: bằng cách trộn lẫn dạng tham chiếu, người lập trình chỉ có nguy cơ rằng giá trị đã sửa của biến sẽ được trả về (hoặc không được trả về) cho chương trình gọi. Trong phiên bản "cổ điển", sự nhầm lẫn như vậy có thể dẫn đến một lỗi nghiêm trọng khi thực hiện một thủ tục (ví dụ: khi một giá trị biến bằng 0 được sử dụng thay vì địa chỉ bộ nhớ).

Các hàm DLL được triển khai theo nguyên tắc “cổ điển” và do đó yêu cầu mô tả bắt buộc về cách trao đổi dữ liệu với từng đối số. Các khai báo hàm thông qua mô tả Khai báo (chính xác hơn là danh sách các đối số được truyền) phục vụ mục đích này. Cách phổ biến nhất để truyền tham số cho hàm Windows API hoặc DLL là sử dụng từ khóa ByVal. Hơn nữa, nó có thể được chỉ định cả trong toán tử Khai báo và trực tiếp khi gọi hàm.

Hậu quả của việc truyền tham số không chính xác rất dễ dự đoán. Nếu bạn nhận được một địa chỉ rõ ràng là không hợp lệ, bạn sẽ nhận được thông báo GPF (Lỗi bảo vệ chung). Nếu hàm nhận được giá trị khớp với địa chỉ hợp lệ thì hàm API sẽ xâm nhập vào một khu vực lạ (ví dụ: nhân Windows) với tất cả những hậu quả tai hại sau đó.

2. Kiểm tra loại tham số được truyền. Số lượng và loại tham số chính xác được truyền đều quan trọng như nhau. Điều cần thiết là các đối số được khai báo trong Khai báo phải khớp với các tham số dự kiến ​​trong hàm API. Trường hợp lỗi phổ biến nhất khi truyền tham số liên quan đến sự khác biệt giữa NULL và chuỗi có độ dài bằng 0 - hãy nhớ rằng đây không phải là những điều giống nhau.

3. Kiểm tra kiểu trả về.

VB khá chấp nhận sự không khớp của kiểu trả về của hàm, vì các giá trị số thường được trả về thông qua các thanh ghi thay vì ngăn xếp. Các quy tắc sau sẽ giúp xác định giá trị chính xác được hàm API trả về:

  • Hàm DLL không trả về giá trị (tương tự như void trong 'C') phải được khai báo là VB Sub.
  • Hàm API trả về giá trị số nguyên (Số nguyên hoặc Dài) có thể được định nghĩa là Hàm phụ hoặc Hàm trả về giá trị thuộc loại thích hợp.
  • Không có hàm API nào trả về số dấu phẩy động, nhưng một số DLL có thể trả về loại dữ liệu này.

4. Sử dụng cấu trúc “As Any” một cách cẩn thận. Nhiều hàm API của Windows có khả năng chấp nhận các tham số thuộc các loại khác nhau và sử dụng cấu trúc As Any để làm như vậy (việc diễn giải loại được thực hiện tùy thuộc vào giá trị của các tham số khác được truyền).

Một giải pháp tốt trong trường hợp này có thể là sử dụng nhiều bí danh (Bí danh) của một hàm bằng cách tạo hai hoặc nhiều khai báo cho cùng một hàm, với mỗi khai báo chỉ định các tham số của một loại cụ thể.

5. Đừng quên khởi tạo chuỗi. Có nhiều hàm trong Win API trả về thông tin bằng cách tải dữ liệu vào bộ đệm chuỗi được truyền dưới dạng tham số. Trong chương trình của bạn, bạn dường như có thể thực hiện mọi thứ một cách chính xác: đừng quên ByVal, truyền tham số cho hàm một cách chính xác. Nhưng Windows không thể kiểm tra kích thước bộ nhớ được phân bổ cho một hàng lớn đến mức nào. Kích thước hàng phải đủ lớn để chứa tất cả dữ liệu có thể được đặt trong đó. Trách nhiệm đặt trước bộ đệm có kích thước yêu cầu thuộc về lập trình viên VB.

Cần lưu ý rằng trong Windows 32 bit, khi sử dụng chuỗi, quá trình chuyển đổi được thực hiện từ Unicode (mã hóa hai byte) sang ANSI (mã hóa một byte) và ngược lại, có tính đến cài đặt hệ thống quốc gia. Vì vậy, để dự trữ bộ đệm, đôi khi sử dụng mảng byte thay vì biến chuỗi sẽ thuận tiện hơn. (Thêm về điều này bên dưới.)

Thông thường, các hàm Win API cho phép bạn tự xác định kích thước khối tối đa. Đặc biệt, đôi khi điều này đòi hỏi phải gọi một hàm API khác để “cho biết” kích thước khối. Ví dụ: GetWindowTextLength cho phép bạn xác định độ dài của chuỗi cần thiết để giữ tiêu đề cửa sổ được hàm GetWindowText trả về. Trong trường hợp này, Windows đảm bảo rằng bạn không đi quá xa.

6. Đảm bảo sử dụng Tùy chọn rõ ràng.

7. Kiểm tra cẩn thận các giá trị tham số và giá trị trả về. VB có khả năng kiểm tra kiểu tốt. Điều này có nghĩa là khi bạn cố gắng truyền một tham số không hợp lệ cho hàm VB, điều tồi tệ nhất có thể xảy ra là bạn nhận được thông báo lỗi từ VB. Nhưng thật không may, cơ chế này không hoạt động khi truy cập các chức năng API của Windows.

Windows 9x đã cải thiện việc kiểm tra tham số cho hầu hết các chức năng API. Do đó, sự hiện diện của lỗi trong dữ liệu thường không gây ra lỗi nghiêm trọng, nhưng việc xác định nguyên nhân gây ra lỗi đó không phải là điều dễ dàng.

Ở đây chúng tôi khuyên bạn nên sử dụng một số cách để gỡ lỗi loại lỗi này:

  • Sử dụng chế độ gỡ lỗi từng bước hoặc lệnh Debug.Print để kiểm tra từng lệnh gọi hàm API đáng ngờ. Kiểm tra kết quả của các cuộc gọi này để đảm bảo mọi thứ đều bình thường và chức năng được hoàn thành chính xác;
  • sử dụng trình gỡ lỗi Windows như CodeView và phiên bản gỡ lỗi của Windows (có sẵn trong Windows SDK). Các công cụ này có thể phát hiện lỗi tham số và ít nhất xác định được hàm API nào đang gây ra lỗi;
  • Sử dụng các công cụ bổ sung của bên thứ ba để kiểm tra các loại tham số và tính hợp lệ của các giá trị của chúng. Những công cụ như vậy không chỉ có thể tìm ra lỗi tham số mà thậm chí còn có thể chỉ ra dòng mã VB nơi xảy ra lỗi.

Ngoài ra, cần kiểm tra kết quả thực thi hàm API.

8. Hãy nhớ rằng số nguyên trong VB và trong Windows không giống nhau. Trước hết, bạn nên nhớ rằng thuật ngữ “Số nguyên” trong VB có nghĩa là số 16 bit, trong khi trong tài liệu Win 32 nó có nghĩa là số 32 bit. Thứ hai, số nguyên (Số nguyên và Độ dài) trong VB là số lượng có dấu (nghĩa là một chữ số được dùng làm dấu, phần còn lại là phần định trị của số), trong Windows chỉ sử dụng các số không âm. Bạn phải ghi nhớ trường hợp này khi tạo một tham số được truyền bằng các phép toán số học (ví dụ: tính địa chỉ bằng cách tính tổng một số cơ số và phần bù). Các hàm số học VB tiêu chuẩn không phù hợp cho việc này. Chúng tôi sẽ thảo luận riêng về những việc cần làm trong trường hợp này.

9. Hãy chú ý đến tên hàm. Không giống như Win16, tên của tất cả các hàm API Win32 rất nhạy cảm với việc sử dụng chính xác chữ thường và chữ in hoa (điều này không xảy ra trong Win16). Nếu ở đâu đó bạn sử dụng chữ cái viết thường thay vì chữ cái viết hoa hoặc ngược lại, thì hàm mong muốn sẽ không được tìm thấy. Ngoài ra, hãy cẩn thận để sử dụng chính xác hậu tố A hoặc W trong các hàm sử dụng tham số chuỗi. (Để biết thêm về điều này, xem bên dưới.)

10. Lưu công việc của bạn thường xuyên. Các lỗi liên quan đến việc sử dụng DLL và Win API không đúng cách có thể dẫn đến việc chấm dứt khẩn cấp môi trường VB và có thể là toàn bộ hệ điều hành. Bạn nên đảm bảo rằng mã bạn viết được lưu trước khi chạy thử. Đơn giản nhất là thiết lập chế độ tự động ghi các module dự án trước khi bắt đầu dự án trong môi trường VB.

Sau khi đọc những lời khuyên trước đó, bạn có thể nghĩ rằng việc sử dụng các hàm Win API có nhiều rủi ro. Ở một mức độ nào đó, điều này đúng, nhưng chỉ so với chương trình an toàn do chính VB cung cấp. Nhưng với việc sử dụng khéo léo và hiểu biết về những cạm bẫy có thể xảy ra, rủi ro này sẽ ở mức tối thiểu. Ngoài ra, thường không thể từ bỏ hoàn toàn việc sử dụng Win API - chúng vẫn sẽ được yêu cầu cho bất kỳ sự phát triển nghiêm túc nào.

Ngoài ra, trước đây chúng tôi đã đề cập đến những cạm bẫy đối với nhiều loại DLL. Trong trường hợp của Win API, mọi thứ đơn giản hơn nhiều vì hình thức truy cập các chức năng này được thống nhất rõ ràng. Cần lưu ý những điểm chính sau:

  1. Các hàm API Win32 chỉ là: các hàm, tức là các thủ tục thuộc loại Hàm (có nhiều thói quen phụ trong API Win16). Tất cả đều là các hàm thuộc kiểu Long nên mô tả của chúng được viết dưới dạng sau: Khai báo Tên hàm ... Vì kiểu hàm Long '_ được xác định rõ ràng

    Khai báo Tên hàm & ‘ loại hàm _ được xác định bằng hậu tố

    Lệnh gọi hàm API trông như thế này:

Kết quả& = ApiName& ([ Danh sách đối số]
  1. Thông thường, giá trị trả về của hàm là mã hoàn thành của thao tác. Hơn nữa, giá trị khác 0 trong trường hợp này có nghĩa là hoàn thành bình thường, 0 có nghĩa là có lỗi. Thông thường (nhưng không phải luôn luôn) bạn có thể làm rõ bản chất của lỗi bằng cách gọi hàm GetLastError. Mô tả của hàm này như sau: Khai báo hàm GetLastError& Lib “kernel32” ()

    CHÚ Ý! Khi làm việc trong VB, tốt hơn là sử dụng thuộc tính LastDLLError của đối tượng Err để lấy giá trị của mã lỗi đủ điều kiện, vì VB đôi khi đặt lại hàm GetLastError giữa việc gọi API và tiếp tục thực thi chương trình.

    Bạn có thể diễn giải mã do GelLastError trả về bằng cách sử dụng các hằng số được ghi trong tệp API32.TXT, với các tên bắt đầu bằng hậu tố ERROR_.

    Các lỗi điển hình nhất có các mã sau:

    • ERROR_INVALID_HANDLE = 6& - địa chỉ không hợp lệ
    • ERROR_CALL_NOT_IMPLEMENTED = 120& - gọi một hàm trong Windows 9x chỉ có cho Windows NT
    • ERROR_INVALID_PARAMETER = 87& - giá trị tham số không chính xác

    Tuy nhiên, nhiều hàm trả về giá trị của một số tham số được yêu cầu (ví dụ: OpenFile trả về giá trị của phần điều khiển tệp). Trong những trường hợp như vậy, lỗi được xác định bởi một số giá trị Return& đặc biệt khác, thường là 0 hoặc –1.

  2. API Win32 sử dụng các cách cố định nghiêm ngặt để truyền các loại dữ liệu đơn giản nhất. a) ByVal...Dài như vậy

    Ít nhất 80% việc truyền đối số được thực hiện bằng cách sử dụng các biến Dài. Lưu ý rằng đối số Luôn luônđược đi kèm với từ khóa ByVal và điều này, cùng với những thứ khác, có nghĩa là việc truyền dữ liệu một chiều được thực hiện - từ chương trình VB sang hàm API.

    B) ByVal...Là chuỗi

    Kiểu truyền dữ liệu này cũng xảy ra khá thường xuyên và với đối số cũng Luôn luônÁp dụng ByVal. Khi một hàm API được gọi, địa chỉ của chuỗi sẽ được ghi vào ngăn xếp, vì vậy trong trường hợp này có thể trao đổi dữ liệu hai chiều. Có một số mối nguy hiểm cần lưu ý khi làm việc với chuỗi.

    Đầu tiên là việc đặt trước bộ nhớ cho một chuỗi được thực hiện trong chương trình gọi, vì vậy nếu hàm API sẽ điền vào chuỗi thì bạn cần tạo một chuỗi có kích thước được yêu cầu trước khi gọi nó. Ví dụ: hàm GetWindowsDirectory trả về đường dẫn đến thư mục Windows, theo định nghĩa, đường dẫn này không được dài quá 144 ký tự. Theo đó, việc gọi hàm này sẽ trông giống như thế này:

    WinPath$ = Space$(144) ' dự trữ một chuỗi _ 144 ký tự Result& = GetWindowsDirectory& (WinTath$, 144) _ ' điền vào bộ đệm ' Kết quả& - số ký tự thực tế trong tên thư mục _ WinPath$ = Left$(WinPath, Result& )

    Vấn đề thứ hai là khi gọi một hàm API, chuỗi nguồn được chuyển đổi thành một số biểu diễn bên trong và khi thoát hàm thì ngược lại. Nếu vào thời Win16, thao tác này chỉ bao gồm việc thêm một byte 0 ở cuối dòng, thì với sự ra đời của Win32, thao tác này đã được thêm vào việc chuyển đổi mã hóa Unicode hai byte sang ANSI và ngược lại. (Điều này đã được thảo luận chi tiết trong bài “Tính năng làm việc với biến chuỗi trong VB”, ComputerPress 10'99 và 01'2000). Hiện tại, hãy lưu ý rằng bằng cách sử dụng cấu trúc ByVal ... As String, bạn có thể trao đổi các chuỗi chỉ với dữ liệu ký tự.

    B) ...Như bất kỳ

    Điều này có nghĩa là một số địa chỉ bộ nhớ đệm sẽ được đẩy lên ngăn xếp, ví dụ, nội dung của địa chỉ đó sẽ được hàm API diễn giải, tùy thuộc vào giá trị của các đối số khác. Tuy nhiên, As Any chỉ có thể được sử dụng trong câu lệnh Khai báo - khi một hàm cụ thể được gọi, một biến cụ thể phải được xác định làm đối số.

    D) ... Là UserDefinedType

    Thiết kế này cũng thường được sử dụng khi cần trao đổi dữ liệu (thường theo cả hai hướng) bằng cách sử dụng một số cấu trúc. Trên thực tế, cấu trúc này là một kiểu triển khai cụ thể của dạng truyền dẫn As Any, chỉ là trong trường hợp này chức năng được cấu hình thành một cấu trúc cố định.

    Hình thức của cấu trúc dữ liệu được xác định bởi hàm API cụ thể và trách nhiệm của người lập trình là mô tả và bảo lưu nó một cách chính xác trong chương trình gọi. Thiết kế này Luôn luônđã sử dụng không có từ ByVal, nghĩa là trong trường hợp này, việc truyền bằng tham chiếu được thực hiện - địa chỉ của biến được ghi vào ngăn xếp.

Ví dụ về cách gọi hàm API

Hãy minh họa điều trên bằng ví dụ về cách sử dụng hai hàm hữu ích để làm việc với tệp - lopen và lread, được mô tả như sau:

Khai báo Hàm lopen Lib “kernel32” _ Bí danh “_lopen” (_ ByVal lpFileName As String, _ ByVal wReadWrite As Long) As Long Khai báo Hàm lread Lib “kernel32” _ Bí danh “_lread” (_ ByVal hFile As Long, lpBuffer Như bất kỳ, _ ByVal wBytes miễn là dài)

Trong VB, các toán tử tương tự của chúng - trong trường hợp này là chính xác - là các toán tử Mở và Nhận (đối với chế độ Nhị phân). Chúng ta hãy chú ý ngay đến việc sử dụng từ khóa Bí danh trong khai báo hàm - đây chính xác là trường hợp bạn không thể làm gì nếu không có nó. Tên hàm thực tế trong thư viện bắt đầu bằng dấu gạch dưới (kiểu ngôn ngữ C điển hình), điều này không được phép trong VB.

Thao tác mở tệp có thể trông như thế này:

Const INVALID_HANDLE_VALUE = -1 ' không chính xác _ giá trị mô tả lpFileName$ = “D:\calc.bas” ' tên tệp wReadWrite& = 2 ' chế độ đọc-ghi hFile& = lopen(lpFileName$, wReadWrite&) _ ' xác định bộ mô tả tệp Nếu hFile& = INVALID_HANDLE_VALUE Sau đó _ ' lỗi khi mở tệp ' chỉ định mã lỗi CodeError& = Err.LastDllError 'CodeError& = GetLastError _ ' cấu trúc này không hoạt động End If

Ở đây bạn cần chú ý đến hai điểm:

  • là giá trị của hàm, chúng ta nhận được giá trị của bộ mô tả tệp. Lỗi tương ứng với giá trị –1;
  • Chính trong trường hợp này, việc gọi hàm GetLastError không hoạt động - để có được giá trị lỗi được tinh chỉnh, chúng tôi đã chuyển sang đối tượng Err (chúng tôi đã nói về khả năng xảy ra tình huống như vậy ở trên).

Sau đó, nội dung của tệp có thể được đọc, nhưng điều này giả định rằng người lập trình phải có một số hiểu biết về cấu trúc của nó (giống như trường hợp khi làm việc với các tệp nhị phân tùy ý). Trong trường hợp này, việc gọi hàm lread có thể trông như thế này:

Dim MyVar As Single wBytes = lread (hFile&, MyVar, Len(MyVar) ' đọc một số thực, 4 byte ' wBytes là số lượng dữ liệu thực sự được đọc, ' -1 là một lỗi... Nhập MyStruct x As Single i As Kiểu kết thúc số nguyên Dim MyVar As MyStruct wBytes = lread (hFile&, MyVar, Len(MyVar)) ' đọc cấu trúc dữ liệu, 6 byte

Xin lưu ý lại: đối số thứ hai của hàm được truyền theo tham chiếu, phần còn lại được truyền theo giá trị.

Dim MyVar As String MyVar = Space$(10) ‘dành riêng một biến cho 10 ký tự wBytes = lread (hFile&, ByVal MyVar, Len(MyVar)) ‘ đọc một chuỗi ký tự, 10 ký tự

Ở đây bạn có thể thấy sự khác biệt quan trọng so với ví dụ trước - biến chuỗi nhất thiết phải đi kèm với từ khóa ByVal.

Việc đọc nội dung của file trong một mảng (để đơn giản chúng ta sẽ sử dụng mảng byte một chiều) được thực hiện như sau:

Dim MyArray(1 To 10) As Byte wBytes = lread (hFile&, MyArray(1), _ Len(MyArray(1))* 10) ‘ đọc 10 phần tử mảng

Bằng cách chỉ định phần tử đầu tiên của mảng làm đối số, chúng ta sẽ chuyển địa chỉ của phần đầu của vùng bộ nhớ dành riêng cho mảng. Rõ ràng, bạn có thể điền bất kỳ đoạn nào của mảng theo cách này:

WBytes = lread (hFile&, MyArray(4), _ Len(MyArray(1))* 5) ‘ đọc các phần tử mảng 4 đến 8

Mẹo 5: Sử dụng Bí danh cho Gears và các thông số Như Bất Kỳ

Ở đây, dựa trên ví dụ trước, chúng tôi sẽ tiết lộ bản chất của mẹo thứ tư của Dan Appleman.

Khi làm việc với hàm lread, bạn nên nhớ rằng khi truy cập nó bằng biến chuỗi, bạn phải sử dụng từ khóa ByVal (nếu không bạn sẽ nhận được thông báo về một hoạt động bất hợp pháp). Để bảo vệ chính mình, bạn có thể tạo một mô tả đặc biệt bổ sung cho cùng một hàm để chỉ hoạt động với các biến chuỗi:

Khai báo Hàm lreadString Lib “kernel32” _ Alias ​​​​“_lread” (_ ByVal hFile As Long, ByVal lpBuffer As String, _ ByVal wBytes As Long) As Long

Khi làm việc với mô tả này, bạn không cần chỉ định ByVal khi liên hệ:

WBytes = lreadString(hFile&, MyVarString, _ Len(MyVarString)) ‘

Có vẻ như cú pháp của toán tử Khai báo cho phép bạn tạo một mô tả đặc biệt tương tự cho một mảng:

Khai báo Hàm lreadString Lib “kernel32” Bí danh “_lread” (_ ByVal hFile As Long, lpBuffer() As Byte, _ ByVal wBytes As Long) As Long

Tuy nhiên, việc kháng cáo

WBytes = lreadArray(hFile&, MyArray(), 10)

chắc chắn sẽ dẫn đến một lỗi chương trình nghiêm trọng.

Đây là phần tiếp theo của cuộc trò chuyện về đặc thù của việc xử lý các biến chuỗi trong Visual Basic: VB sử dụng mã hóa Unicode hai byte, Win API sử dụng ANSI một byte (và với định dạng được áp dụng trong C - có byte 0 ở cuối) . Theo đó, khi sử dụng biến chuỗi làm đối số, việc chuyển đổi từ Unicode sang ANSI luôn được thực hiện tự động khi gọi một hàm API (chính xác hơn là hàm DLL) và chuyển đổi ngược lại khi trả về.

Bài học rút ra từ điều này rất đơn giản: Các biến chuỗi có thể được sử dụng để trao đổi dữ liệu ký tự, nhưng chúng không thể được sử dụng để trao đổi thông tin nhị phân tùy ý (như trường hợp của phiên bản VB 16 bit). Trong trường hợp sau, tốt hơn nên sử dụng mảng byte một chiều.

Như bạn đã biết, kiểu String có thể được sử dụng để mô tả một cấu trúc tùy chỉnh. Về vấn đề này, bạn cần nhớ những điều sau:

  • Nghiêm cấm sử dụng cấu trúc sau để truy cập Win API: Type MyStruct x As Single s As String 'chuỗi có độ dài thay đổi Loại kết thúc

    Trong trường hợp chuỗi có độ dài thay đổi, bộ mô tả chuỗi được truyền như một phần của cấu trúc với tất cả các hậu quả tiếp theo dưới dạng lỗi thực thi chương trình.

  • Bạn có thể sử dụng chuỗi có độ dài cố định làm thành phần cấu trúc: Nhập MyStruct x As Single s As String*8 ‘ chuỗi có độ dài cố định Loại kết thúc

Trong trường hợp này, việc chuyển đổi mã hóa tương ứng được thực hiện.

Và một lưu ý cuối cùng: trong mọi trường hợp, bạn không nên sử dụng một mảng các biến chuỗi (cả độ dài cố định và độ dài thay đổi) khi truy cập hàm API. Nếu không, sự xuất hiện của một “hoạt động bất hợp pháp” sẽ được đảm bảo.

Rất có thể bạn sẽ gặp phải tình huống cần phải viết các hàm DLL của riêng mình. Nhu cầu về điều này chắc chắn sẽ nảy sinh nếu bạn sử dụng công nghệ lập trình hỗn hợp - sử dụng hai hoặc nhiều ngôn ngữ lập trình để triển khai một ứng dụng.

Về vấn đề này, chúng tôi lưu ý rằng lập trình hỗn hợp khá phổ biến để triển khai một ứng dụng khá phức tạp. Thật vậy, mỗi ngôn ngữ (chính xác hơn là hệ thống lập trình dựa trên một ngôn ngữ) đều có điểm mạnh và điểm yếu riêng, vì vậy việc tận dụng các công cụ khác nhau để giải quyết các vấn đề khác nhau là điều khá hợp lý. Ví dụ: VB - để tạo giao diện người dùng, C - để truy cập hiệu quả vào tài nguyên hệ thống, Fortran - để triển khai các thuật toán số.

Ý kiến ​​​​của tác giả là thế này: bất kỳ chương trình lập trình nghiêm túc nào cũng yêu cầu nhà phát triển phải thành thạo ít nhất hai công cụ. Tất nhiên, trong điều kiện hiện đại có sự phân công lao động rõ ràng, rất khó để trở thành một chuyên gia xuất sắc ngay cả trong hai hệ thống, vì vậy sơ đồ “ngôn ngữ chính và ngôn ngữ phụ” sẽ hợp lý hơn. Ý tưởng ở đây là ngay cả kiến ​​​​thức hời hợt về ngôn ngữ “phụ trợ” (viết các thủ tục khá đơn giản) cũng có thể cải thiện đáng kể hiệu quả của việc sử dụng ngôn ngữ “chính”. Lưu ý rằng kiến ​​thức về VB, ít nhất là với vai trò phụ trợ, ngày nay gần như là yêu cầu bắt buộc đối với một lập trình viên chuyên nghiệp. Nhân tiện, vào thời của DOS, kiến ​​thức cơ bản về Assembler là điều cực kỳ đáng mơ ước đối với bất kỳ lập trình viên nào, kể cả Basic.

Bằng cách này hay cách khác, ngay cả trong làm việc nhóm, khi mỗi lập trình viên thực hiện nhiệm vụ cụ thể của riêng mình, tất cả những người tham gia dự án đều phải có ý tưởng về các tính năng của giao diện thủ tục bằng các ngôn ngữ khác nhau. Và hãy biết rằng nhiều hệ thống lập trình (bao gồm cả VB), ngoài giao diện mặc định, còn cho phép bạn sử dụng các phương pháp truy cập quy trình nâng cao khác để có thể điều chỉnh giao diện sang ngôn ngữ khác.

Khi nghiên cứu giao diện liên thủ tục, bạn nên chú ý đến những cạm bẫy có thể xảy ra sau đây:

  • Các ngôn ngữ khác nhau có thể sử dụng các quy ước khác nhau để viết mã định danh. Ví dụ: người ta thường sử dụng dấu gạch dưới ở đầu tên thủ tục, điều này không được phép trong VB. Vấn đề này có thể được giải quyết dễ dàng bằng cách sử dụng từ khóa Bí danh trong câu lệnh Khai báo (xem ví dụ mẹo 2.3).
  • Có thể sử dụng một trình tự ghi khác đã truyền các đối số vào ngăn xếp. Ví dụ, vào thời của DOS (tôi thành thật thừa nhận, tôi không biết bây giờ trong môi trường Windows trông như thế nào), C viết các đối số từ cuối danh sách, các ngôn ngữ khác (Fortran, Pascal, Basic) - từ đầu.
  • Theo mặc định, các nguyên tắc truyền tham số khác nhau được sử dụng - theo tham chiếu hoặc theo giá trị.
  • Các nguyên tắc khác nhau để lưu trữ các biến chuỗi. Ví dụ: trong C (cũng như trong Fortran và Pascal), độ dài của chuỗi được xác định bởi byte rỗng ở cuối chuỗi, nhưng trong Basic độ dài được viết rõ ràng trong bộ mô tả chuỗi. Tất nhiên, bạn cần lưu ý khả năng sử dụng các cách mã hóa ký tự khác nhau.
  • Khi chuyển mảng nhiều chiều, bạn nên nhớ rằng có thể có nhiều tùy chọn khác nhau để chuyển đổi cấu trúc đa chiều thành cấu trúc một chiều (bắt đầu từ chỉ mục đầu tiên hoặc từ chỉ mục cuối cùng, liên quan đến mảng hai chiều - “theo hàng” hoặc “theo cột” ).

Khi tính đến tất cả những điều này, các khuyến nghị sau có thể được đưa ra:

  • Sử dụng các phương pháp đơn giản nhất, đã được chứng minh để truyền đối số cho các hàm DLL. Các tiêu chuẩn được áp dụng cho Win API khá phù hợp làm mô hình.
  • Không bao giờ chuyển mảng các biến chuỗi.
  • Hãy hết sức cẩn thận khi truyền các biến chuỗi đơn giản và mảng nhiều chiều.
  • Hãy chắc chắn kiểm tra đặc biệt chức năng của cơ chế truyền đối số cho thủ tục được gọi và ngược lại. Viết một bài kiểm tra đặc biệt để kiểm tra việc truyền dữ liệu. Kiểm tra riêng biệt xem mỗi đối số có được truyền chính xác hay không. Ví dụ: nếu bạn có một quy trình có nhiều đối số, trước tiên hãy kiểm tra xem mỗi tham số có được truyền chính xác cho tùy chọn một đối số hay không và chỉ sau đó cho toàn bộ danh sách.

Nhưng điều gì sẽ xảy ra nếu hàm DLL đã được viết, chẳng hạn như trong Fortran, nhưng giao diện đầu vào của nó không phù hợp lắm với các tiêu chuẩn VB ở trên? Có hai lời khuyên ở đây. Đầu tiên: viết hàm DLL kiểm tra và sử dụng nó để cố gắng tìm lệnh gọi mong muốn từ chương trình VB bằng cách dùng thử và lỗi. Thứ hai: viết một thủ tục bộ điều hợp trong cùng một Fortran để cung cấp một giao diện đơn giản giữa VB và hàm DLL với việc chuyển đổi các cấu trúc dữ liệu đơn giản thành các cấu trúc dữ liệu phức tạp (ví dụ: chuyển đổi một mảng byte nhiều chiều thành một mảng chuỗi).

Vì vậy: hãy sử dụng các hàm DLL. Nhưng vẫn phải cảnh giác...

Máy TínhPress 9"2000

Thời gian ngắn hạn này được biết đến với tất cả những người có ít nhất một số kinh nghiệm phát triển. Nhưng không phải ai cũng hiểu chính xác nó có ý nghĩa gì và tại sao lại cần thiết. Nhà phát triển Peter Gazarovđã nói về API một cách đơn giản trên blog của anh ấy.

API viết tắt là viết tắt của “Application Programming Interface” (giao diện lập trình ứng dụng, giao diện lập trình ứng dụng). Hầu hết các công ty lớn ở một số giai đoạn đều phát triển API cho khách hàng hoặc để sử dụng nội bộ. Để hiểu cách thức và cách sử dụng API trong phát triển và kinh doanh, trước tiên bạn cần hiểu cách thức hoạt động của World Wide Web.

World Wide Web và các máy chủ từ xa

WWW có thể được coi là một mạng lưới khổng lồ gồm các máy chủ được kết nối với nhau, trên đó mọi trang đều được lưu trữ. Một máy tính xách tay thông thường có thể được biến thành một máy chủ có khả năng phục vụ toàn bộ trang web trên mạng và các nhà phát triển sử dụng máy chủ cục bộ để tạo trang web trước khi mở chúng cho nhiều người dùng.

Khi nhập vào thanh địa chỉ của trình duyệt www.facebook.com Một yêu cầu tương ứng sẽ được gửi đến máy chủ Facebook từ xa. Khi trình duyệt nhận được phản hồi, nó sẽ diễn giải mã và hiển thị trang.

Mỗi khi người dùng truy cập một trang trên Internet, anh ta sẽ tương tác với API của máy chủ từ xa. API là một phần thành phần của máy chủ nhận yêu cầu và gửi phản hồi.

API như một cách để phục vụ khách hàng

Nhiều công ty cung cấp API như một sản phẩm làm sẵn. Ví dụ: Weather Underground bán quyền truy cập vào API dữ liệu thời tiết của mình.

Kịch bản sử dụng: Trên trang web của một công ty nhỏ có một hình thức đặt lịch hẹn cho khách hàng. Công ty muốn tích hợp Lịch Google vào đó để cung cấp cho khách hàng khả năng tự động tạo sự kiện và nhập thông tin chi tiết về cuộc họp sắp tới.

Ứng dụng API: Mục tiêu là để máy chủ trang web liên hệ trực tiếp với máy chủ Google với yêu cầu tạo sự kiện với các chi tiết được chỉ định, nhận phản hồi của Google, xử lý nó và gửi thông tin thích hợp tới trình duyệt, ví dụ: thông báo xác nhận cho người dùng .

Ngoài ra, trình duyệt có thể đưa ra yêu cầu tới API máy chủ của Google mà không cần thông qua máy chủ của công ty.

API Lịch Google khác với API của bất kỳ máy chủ từ xa nào khác trên mạng như thế nào?

Về mặt kỹ thuật, sự khác biệt nằm ở định dạng của yêu cầu và phản hồi. Để tạo một trang web đầy đủ, trình duyệt cần có phản hồi bằng ngôn ngữ đánh dấu HTML, trong khi API Lịch Google sẽ chỉ trả về dữ liệu ở định dạng như JSON.

Nếu yêu cầu tới API được thực hiện bởi máy chủ của trang web của công ty thì đó là máy khách (giống như trình duyệt là máy khách khi người dùng mở trang web).

Nhờ API, người dùng có cơ hội thực hiện một hành động mà không cần rời khỏi trang web của công ty.

Hầu hết các trang web hiện đại đều sử dụng ít nhất một vài API của bên thứ ba. Nhiều tác vụ đã có giải pháp làm sẵn do các nhà phát triển bên thứ ba cung cấp, có thể là thư viện hoặc dịch vụ. Việc sử dụng giải pháp làm sẵn thường dễ dàng và đáng tin cậy hơn.

Nhiều nhà phát triển phân phối ứng dụng đến một số máy chủ tương tác với nhau bằng API. Các máy chủ thực hiện chức năng hỗ trợ cho máy chủ ứng dụng chính được gọi là microservice.

Vì vậy, khi một công ty cung cấp API cho người dùng, điều đó chỉ có nghĩa là công ty đó đã tạo một loạt URL đặc biệt chỉ trả về dữ liệu dưới dạng phản hồi.

Những yêu cầu như vậy thường có thể được gửi qua trình duyệt. Vì việc truyền dữ liệu HTTP diễn ra ở dạng văn bản nên trình duyệt sẽ luôn có thể hiển thị phản hồi. Ví dụ: thông qua trình duyệt, bạn có thể truy cập trực tiếp API GitHub (https://api.github.com/users/petrgazarov) mà không cần mã thông báo truy cập và nhận phản hồi này ở định dạng JSON:

Trình duyệt hiển thị hoàn hảo phản hồi JSON, có thể được chèn vào mã. Thật dễ dàng để trích xuất dữ liệu từ văn bản đó để sử dụng theo ý của bạn.

Một số ví dụ API khác

Từ "ứng dụng" có thể có nhiều ý nghĩa khác nhau. Trong ngữ cảnh của API, điều này có nghĩa là:

  • một phần mềm có chức năng cụ thể,
  • toàn bộ máy chủ, toàn bộ ứng dụng hoặc chỉ một phần riêng biệt của ứng dụng.

Bất kỳ phần mềm nào có thể phân biệt rõ ràng với môi trường đều có thể thay thế chữ “A” trong tên viết tắt tiếng Anh và cũng có thể có một số loại API. Ví dụ: khi nhà phát triển triển khai thư viện của bên thứ ba vào mã, nó sẽ trở thành một phần của toàn bộ ứng dụng. Là một phần mềm độc lập, thư viện sẽ có một số loại API cho phép nó tương tác với phần còn lại của mã ứng dụng.

Trong thiết kế hướng đối tượng, mã được biểu diễn dưới dạng một tập hợp các đối tượng. Trong một ứng dụng, có thể có hàng trăm đối tượng như vậy tương tác với nhau. Mỗi người trong số họ có bộ API riêng công cộng các thuộc tính và phương thức để tương tác với các đối tượng khác trong ứng dụng. Các đối tượng cũng có thể có riêng tư, logic bên trong bị ẩn khỏi môi trường và không phải là API.