Tại sao con trỏ không được hỗ trợ trong python?

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 là thư viện hàm ngoại cho Python. Nó cung cấp các kiểu dữ liệu tương thích với C và cho phép gọi các hàm trong DLL hoặc thư viện dùng chung. Nó có thể được sử dụng để bọc các thư viện này bằng Python thuần túy

hướng dẫn ctypes¶

Ghi chú. Các mẫu mã trong hướng dẫn này sử dụng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
2 để đảm bảo rằng chúng thực sự hoạt động. Vì một số mẫu mã hoạt động khác nhau trong Linux, Windows hoặc macOS nên chúng chứa các lệnh doctest trong nhận xét

Ghi chú. Một số mẫu mã tham khảo loại ctypes

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
3. Trên các nền tảng mà
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
4 nó là bí danh của
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
5. Vì vậy, bạn không nên nhầm lẫn nếu
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
5 được in nếu bạn mong đợi
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
3 - chúng thực sự là cùng một loại

Đang tải các thư viện liên kết động¶

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 xuất cdll và trên các đối tượng Windll và oledll của Windows để tải các thư viện liên kết động

Bạn tải các thư viện bằng cách truy cập chúng dưới dạng thuộc tính của các đối tượng này. cdll tải các thư viện xuất các hàm bằng cách sử dụng quy ước gọi điện

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
9 tiêu chuẩn, trong khi các thư viện Windll gọi các hàm bằng cách sử dụng quy ước gọi điện
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
0. oledll cũng sử dụng quy ước gọi
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
0 và giả định rằng các hàm trả về mã lỗi Windows
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
2. Mã lỗi được sử dụng để tự động đưa ra một ngoại lệ
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
3 khi lệnh gọi hàm không thành công

Đã thay đổi trong phiên bản 3. 3. Các lỗi Windows từng gây ra

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
4, hiện là bí danh của
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
3.

Dưới đây là một số ví dụ cho Windows. Lưu ý rằng

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
6 là thư viện C tiêu chuẩn của MS chứa hầu hết các hàm C tiêu chuẩn và sử dụng quy ước gọi cdecl

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
6

Windows tự động nối thêm hậu tố tệp

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
7 thông thường

Ghi chú

Truy cập thư viện C tiêu chuẩn thông qua

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
8 sẽ sử dụng phiên bản lỗi thời của thư viện có thể không tương thích với phiên bản đang được Python sử dụng. Nếu có thể, hãy sử dụng chức năng Python gốc hoặc nhập và sử dụng mô-đun
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
6

Trên Linux, cần chỉ định tên tệp bao gồm cả phần mở rộng để tải thư viện, vì vậy không thể sử dụng quyền truy cập thuộc tính để tải thư viện. Nên sử dụng phương thức

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
000 của trình tải dll hoặc bạn nên tải thư viện bằng cách tạo một phiên bản CDLL bằng cách gọi hàm tạo

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0

Truy cập các chức năng từ các dll đã tải¶

Các chức năng được truy cập dưới dạng thuộc tính của các đối tượng dll

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
2

Lưu ý rằng các dll hệ thống win32 như

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
001 và
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
002 thường xuất các phiên bản ANSI cũng như UNICODE của một chức năng. Phiên bản UNICODE được xuất với một
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
003 được thêm vào tên, trong khi phiên bản ANSI được xuất với một
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
004 được thêm vào tên. Hàm win32
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
005, trả về một điều khiển mô-đun cho một tên mô-đun nhất định, có nguyên mẫu C sau đây và một macro được sử dụng để hiển thị một trong số chúng là
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
005 tùy thuộc vào việc UNICODE có được xác định hay không

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
9

Windll không cố gắng chọn một trong số chúng bằng phép thuật, bạn phải truy cập phiên bản bạn cần bằng cách chỉ định rõ ràng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
007 hoặc
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
008, sau đó gọi nó bằng các đối tượng byte hoặc chuỗi tương ứng

Đôi khi, các hàm xuất dll có tên không phải là mã định danh Python hợp lệ, chẳng hạn như

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
009. Trong trường hợp này, bạn phải sử dụng
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
010 để truy xuất chức năng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
4

Trên Windows, một số hàm xuất dll không theo tên mà theo thứ tự. Các chức năng này có thể được truy cập bằng cách lập chỉ mục đối tượng dll với số thứ tự

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
5

Gọi hàm¶

Bạn có thể gọi các hàm này giống như bất kỳ hàm nào khác có thể gọi được của Python. Ví dụ này sử dụng hàm

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
011, trả về thời gian hệ thống tính bằng giây kể từ kỷ nguyên Unix và hàm
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
012, trả về một điều khiển mô-đun win32

Ví dụ này gọi cả hai hàm với một con trỏ

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
013 [
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
014 nên được sử dụng làm con trỏ
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
013]

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
1

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
016 được nâng lên khi bạn gọi một hàm
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
0 với quy ước gọi
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
9 hoặc ngược lại

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
5

Để tìm ra quy ước gọi chính xác, bạn phải xem tệp tiêu đề C hoặc tài liệu về chức năng bạn muốn gọi

Trên Windows,

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 sử dụng xử lý ngoại lệ có cấu trúc win32 để ngăn sự cố do lỗi bảo vệ chung khi các hàm được gọi với giá trị đối số không hợp lệ

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>

Tuy nhiên, có đủ cách để đánh sập Python với

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0, vì vậy dù sao thì bạn cũng nên cẩn thận. Mô-đun
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
021 có thể hữu ích trong việc gỡ lỗi sự cố [e. g. từ các lỗi phân đoạn được tạo ra bởi các lệnh gọi thư viện C sai]

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
014, các đối tượng số nguyên, byte và chuỗi [unicode] là các đối tượng Python gốc duy nhất có thể được sử dụng trực tiếp làm tham số trong các lệnh gọi hàm này.
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
014 được truyền dưới dạng con trỏ C
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
013, các đối tượng byte và chuỗi được truyền dưới dạng con trỏ tới khối bộ nhớ chứa dữ liệu của chúng [ char* or wchar_t*]. Python integers are passed as the platforms default C int mặc định của nền tảng, giá trị của chúng được ẩn để phù hợp với loại C.

Trước khi chuyển sang gọi hàm với các kiểu tham số khác, chúng ta phải tìm hiểu thêm về kiểu dữ liệu

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0

Các kiểu dữ liệu cơ bản¶

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 định nghĩa một số kiểu dữ liệu tương thích với C nguyên thủy

loại ctypes

loại C

loại trăn

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
027

_Bool

bo bo [1]

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
028

than

đối tượng byte 1 ký tự

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
029

wchar_t

chuỗi 1 ký tự

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
030

than

int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
031

không dấu ký tự

int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
032

ngắn

int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
033

không dấu ngắn

int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
3

int

int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
035

không dấu int

int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
5

Dài

int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
037

không dấu dài

int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
038

__int64 hoặc dài dài

int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
039

không dấu __int64 hoặc không dấu dài long

int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
040

size_t

int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
041

ssize_t hoặc Py_ssize_t

int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
042

trôi nổi

trôi nổi

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
043

kép

trôi nổi

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
044

dài gấp đôi

trôi nổi

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
045

char* [NUL chấm dứt]

đối tượng byte hoặc

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
014

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
047

wchar_t* [NUL chấm dứt]

chuỗi hoặc

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
014

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
049

khoảng trống*

int hoặc

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
014

  1. Hàm tạo chấp nhận bất kỳ đối tượng nào có giá trị thật

Tất cả các loại này có thể được tạo bằng cách gọi chúng bằng một trình khởi tạo tùy chọn đúng loại và giá trị

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>

Vì các loại này có thể thay đổi, giá trị của chúng cũng có thể được thay đổi sau đó

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
00

Việc gán một giá trị mới cho các thể hiện của các loại con trỏ

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
045,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
047 và
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
049 sẽ thay đổi vị trí bộ nhớ mà chúng trỏ tới, chứ không phải nội dung của khối bộ nhớ [tất nhiên là không, vì các đối tượng byte trong Python là bất biến]

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
01

Tuy nhiên, bạn nên cẩn thận, không chuyển chúng đến các hàm mong đợi con trỏ tới bộ nhớ có thể thay đổi. Nếu bạn cần các khối bộ nhớ có thể thay đổi, ctypes có chức năng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
054 để tạo các khối này theo nhiều cách khác nhau. Nội dung khối bộ nhớ hiện tại có thể được truy cập [hoặc thay đổi] bằng thuộc tính
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
055;

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
02

Hàm

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
054 thay thế hàm
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
058 cũ [vẫn có sẵn dưới dạng bí danh]. Để tạo khối bộ nhớ có thể thay đổi chứa các ký tự unicode thuộc loại C wchar_t , hãy sử dụng hàm
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
059.

Các chức năng gọi, tiếp tục¶

Lưu ý rằng printf in ra kênh đầu ra tiêu chuẩn thực, không phải

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
060, vì vậy những ví dụ này sẽ chỉ hoạt động tại dấu nhắc bảng điều khiển, không phải từ bên trong IDLE hoặc PythonWin

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
03

Như đã đề cập trước đây, tất cả các loại Python ngoại trừ các đối tượng số nguyên, chuỗi và byte phải được gói trong loại

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 tương ứng của chúng, để chúng có thể được chuyển đổi thành loại dữ liệu C được yêu cầu

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
04

Gọi các hàm biến thiên¶

Trên nhiều nền tảng, việc gọi các hàm biến đổi thông qua ctypes hoàn toàn giống như gọi các hàm với một số tham số cố định. Trên một số nền tảng và đặc biệt là ARM64 dành cho Nền tảng Apple, quy ước gọi hàm biến đổi khác với quy ước gọi hàm thông thường

Trên các nền tảng đó, bắt buộc phải chỉ định thuộc tính argtypes cho các đối số hàm thông thường, không biến đổi

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
05

Bởi vì việc chỉ định thuộc tính không hạn chế tính di động, nên luôn chỉ định ________ 2062 cho tất cả các hàm biến đổi

Gọi hàm với kiểu dữ liệu tùy chỉnh của riêng bạn¶

Bạn cũng có thể tùy chỉnh chuyển đổi đối số

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 để cho phép sử dụng các thể hiện của các lớp của riêng bạn làm đối số hàm.
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 tìm thuộc tính
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
065 và sử dụng thuộc tính này làm đối số của hàm. Tất nhiên, nó phải là một trong số nguyên, chuỗi hoặc byte

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
06

Nếu không muốn lưu trữ dữ liệu của phiên bản trong biến phiên bản

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
065, bạn có thể xác định một
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
067 để cung cấp thuộc tính theo yêu cầu

Chỉ định các loại đối số bắt buộc [nguyên mẫu hàm]¶

Có thể chỉ định các loại đối số bắt buộc của các hàm được xuất từ ​​DLL bằng cách đặt thuộc tính

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
062

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
062 phải là một chuỗi các kiểu dữ liệu C [hàm
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
070 có lẽ không phải là một ví dụ hay ở đây, vì nó nhận một số biến và các loại tham số khác nhau tùy thuộc vào chuỗi định dạng, mặt khác, điều này khá thuận tiện để thử nghiệm với điều này

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
07

Chỉ định một định dạng bảo vệ chống lại các loại đối số không tương thích [giống như một nguyên mẫu cho hàm C] và cố gắng chuyển đổi các đối số thành các loại hợp lệ

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
08

Nếu bạn đã xác định các lớp của riêng mình mà bạn chuyển đến các lời gọi hàm, thì bạn phải triển khai một phương thức lớp

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
071 để chúng có thể sử dụng chúng trong chuỗi
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
062. Phương thức lớp
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
071 nhận đối tượng Python được chuyển đến lệnh gọi hàm, nó sẽ thực hiện kiểm tra đánh máy hoặc bất kỳ điều gì cần thiết để đảm bảo đối tượng này được chấp nhận, sau đó trả về chính đối tượng đó, thuộc tính
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
065 của nó hoặc bất kỳ thứ gì bạn muốn chuyển dưới dạng . Một lần nữa, kết quả phải là một số nguyên, chuỗi, byte, một thực thể
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 hoặc một đối tượng có thuộc tính
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
065

Các kiểu trả về¶

Theo mặc định, hàm được giả sử trả về loại C int . Các kiểu trả về khác có thể được chỉ định bằng cách đặt thuộc tính

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
077 của đối tượng hàm.

Đây là một ví dụ nâng cao hơn, nó sử dụng hàm

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
078, hàm này mong đợi một con trỏ chuỗi và một ký tự, đồng thời trả về một con trỏ tới một chuỗi

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
09

Nếu bạn muốn tránh các cuộc gọi ________ 2079 ở trên, bạn có thể đặt thuộc tính ________ 2062 và đối số thứ hai sẽ được chuyển đổi từ đối tượng byte Python ký tự đơn thành ký tự C

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
20

Bạn cũng có thể sử dụng một đối tượng Python có thể gọi được [ví dụ như một hàm hoặc một lớp] làm thuộc tính

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
077, nếu hàm ngoại trả về một số nguyên. Hàm có thể gọi được sẽ được gọi với số nguyên mà hàm C trả về và kết quả của lệnh gọi này sẽ được sử dụng làm kết quả của lệnh gọi hàm của bạn. Điều này hữu ích để kiểm tra các giá trị trả về lỗi và tự động đưa ra một ngoại lệ

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
21

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
082 là một hàm sẽ gọi Windows
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
083 api để lấy chuỗi đại diện của mã lỗi và trả về một ngoại lệ.
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
082 lấy tham số mã lỗi tùy chọn, nếu không có ai dùng thì gọi
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
085 để lấy

Xin lưu ý rằng có một cơ chế kiểm tra lỗi mạnh mẽ hơn nhiều thông qua thuộc tính

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
086;

Truyền con trỏ [hoặc. truyền tham số theo tham chiếu]¶

Đôi khi, một hàm C api mong đợi một con trỏ tới một loại dữ liệu làm tham số, có thể ghi vào vị trí tương ứng hoặc nếu dữ liệu quá lớn để được truyền theo giá trị. Điều này còn được gọi là truyền tham số theo tham chiếu

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 xuất hàm
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
088 được sử dụng để truyền tham số theo tham chiếu. Hiệu ứng tương tự có thể đạt được với hàm
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
089, mặc dù
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
089 làm được nhiều việc hơn vì nó xây dựng một đối tượng con trỏ thực, vì vậy sử dụng
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
088 sẽ nhanh hơn nếu bạn không cần đối tượng con trỏ trong chính Python

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
22

Cấu trúc và hiệp hội¶

Các cấu trúc và liên kết phải xuất phát từ các lớp cơ sở

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
092 và
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
093 được định nghĩa trong mô-đun
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0. Mỗi lớp con phải xác định một thuộc tính
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095.
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095 phải là danh sách gồm 2 bộ, chứa tên trường và loại trường

Loại trường phải là loại

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 như
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
3 hoặc bất kỳ loại
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 dẫn xuất nào khác. cấu trúc, hợp, mảng, con trỏ

Đây là một ví dụ đơn giản về cấu trúc POINT, chứa hai số nguyên có tên x và y, đồng thời chỉ ra cách khởi tạo cấu trúc trong hàm tạo

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
23

Tuy nhiên, bạn có thể xây dựng các cấu trúc phức tạp hơn nhiều. Bản thân cấu trúc có thể chứa các cấu trúc khác bằng cách sử dụng cấu trúc làm kiểu trường

Đây là một cấu trúc RECT chứa hai POINT có tên là upperleft và Lowerright

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
24

Các cấu trúc lồng nhau cũng có thể được khởi tạo trong hàm tạo theo nhiều cách

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
25

Trường mô tả có thể được truy xuất từ ​​lớp, chúng hữu ích cho việc gỡ lỗi vì chúng có thể cung cấp thông tin hữu ích.

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
26

Cảnh báo

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 không hỗ trợ chuyển các liên kết hoặc cấu trúc có trường bit cho các hàm theo giá trị. Mặc dù điều này có thể hoạt động trên 32-bit x86, nhưng nó không được thư viện đảm bảo hoạt động trong trường hợp chung. Các liên kết và cấu trúc với các trường bit phải luôn được chuyển đến các hàm bằng con trỏ

Căn chỉnh cấu trúc/liên kết và thứ tự byte¶

Theo mặc định, các trường Cấu trúc và Liên kết được căn chỉnh giống như cách mà trình biên dịch C thực hiện. Có thể ghi đè hành vi này bằng cách chỉ định thuộc tính lớp

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
201 trong định nghĩa lớp con. Điều này phải được đặt thành một số nguyên dương và chỉ định căn chỉnh tối đa cho các trường. Đây là điều mà
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
202 cũng làm trong MSVC

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 sử dụng thứ tự byte gốc cho Cấu trúc và Liên kết. Để xây dựng các cấu trúc với thứ tự byte không có nguồn gốc, bạn có thể sử dụng một trong các lớp cơ sở
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
204,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
205,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
206 và
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
207. Các lớp này không thể chứa các trường con trỏ

Các trường bit trong cấu trúc và liên kết¶

Có thể tạo các cấu trúc và liên kết chứa các trường bit. Các trường bit chỉ khả dụng cho các trường số nguyên, độ rộng bit được chỉ định là mục thứ ba trong bộ dữ liệu

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
27

Mảng¶

Mảng là các chuỗi, chứa một số lượng cố định các thể hiện cùng loại

Cách khuyến nghị để tạo các kiểu mảng là nhân một kiểu dữ liệu với một số nguyên dương

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
28

Đây là một ví dụ về kiểu dữ liệu hơi giả tạo, cấu trúc chứa 4 ĐIỂM trong số những thứ khác

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
29

Các thể hiện được tạo theo cách thông thường, bằng cách gọi lớp

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
90

Đoạn mã trên in ra một loạt các dòng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
209, bởi vì nội dung của mảng được khởi tạo bằng 0

Trình khởi tạo đúng loại cũng có thể được chỉ định

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
91

Con trỏ¶

Các trường hợp con trỏ được tạo bằng cách gọi hàm

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
089 trên loại
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
92

Các thể hiện con trỏ có thuộc tính

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
212 trả về đối tượng mà con trỏ trỏ tới, đối tượng
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
213 ở trên

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
93

Lưu ý rằng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 không có OOR [trả về đối tượng ban đầu], nó xây dựng một đối tượng mới, tương đương mỗi khi bạn truy xuất một thuộc tính

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
94

Gán một phiên bản

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
3 khác cho thuộc tính nội dung của con trỏ sẽ khiến con trỏ trỏ đến vị trí bộ nhớ nơi lưu trữ nội dung này

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
95

Các trường hợp con trỏ cũng có thể được lập chỉ mục với các số nguyên

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
96

Việc gán cho một chỉ mục số nguyên sẽ thay đổi giá trị được trỏ tới

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
97

Cũng có thể sử dụng các chỉ số khác 0, nhưng bạn phải biết mình đang làm gì, giống như trong C. Bạn có thể truy cập hoặc thay đổi vị trí bộ nhớ tùy ý. Nói chung, bạn chỉ sử dụng tính năng này nếu bạn nhận được một con trỏ từ hàm C và bạn biết rằng con trỏ thực sự trỏ đến một mảng thay vì một mục đơn lẻ

Đằng sau hậu trường, hàm

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
089 không chỉ đơn giản là tạo các thể hiện con trỏ, trước tiên nó phải tạo các loại con trỏ. Điều này được thực hiện với hàm
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
217, chấp nhận bất kỳ loại
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 nào và trả về một loại mới

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
98

Gọi loại con trỏ không có đối số sẽ tạo ra một con trỏ

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
013. Con trỏ
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
013 có giá trị boolean
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
221

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
99

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 kiểm tra
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
013 khi các con trỏ hủy tham chiếu [nhưng các con trỏ không phải ____2013 không hợp lệ khi hủy tham chiếu sẽ làm hỏng Python]

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
40

Loại chuyển đổi¶

Thông thường, ctypes kiểm tra loại nghiêm ngặt. Điều này có nghĩa là, nếu bạn có

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
225 trong danh sách
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
062 của một hàm hoặc là loại của trường thành viên trong định nghĩa cấu trúc, thì chỉ các phiên bản có cùng loại mới được chấp nhận. Có một số ngoại lệ đối với quy tắc này, trong đó ctypes chấp nhận các đối tượng khác. Ví dụ: bạn có thể chuyển các thể hiện mảng tương thích thay vì các kiểu con trỏ. Vì vậy, đối với
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
225, ctypes chấp nhận một mảng c_int

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
41

Ngoài ra, nếu một đối số của hàm được khai báo rõ ràng là một loại con trỏ [chẳng hạn như

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
225] trong
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
062, thì một đối tượng thuộc loại được chỉ định [trong trường hợp này là
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
3] có thể được truyền cho hàm. ctypes sẽ tự động áp dụng chuyển đổi
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
088 bắt buộc trong trường hợp này

Để đặt trường loại CON TRỎ thành

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
013, bạn có thể gán
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
014

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
42

Đôi khi bạn gặp trường hợp các loại không tương thích. Trong C, bạn có thể ép kiểu này thành kiểu khác.

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 cung cấp hàm
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
235 có thể được sử dụng theo cách tương tự. Cấu trúc
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
236 được xác định ở trên chấp nhận con trỏ
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
225 hoặc mảng
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
3 cho trường
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
239 của nó, nhưng không phải trường hợp của các loại khác

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
43

Đối với những trường hợp này, chức năng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
235 rất hữu ích

Hàm

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
235 có thể được sử dụng để truyền một cá thể ctypes thành một con trỏ tới một kiểu dữ liệu ctypes khác.
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
235 nhận hai tham số, một đối tượng ctypes hoặc có thể được chuyển đổi thành một loại con trỏ nào đó và một loại con trỏ ctypes. Nó trả về một thể hiện của đối số thứ hai, tham chiếu đến cùng một khối bộ nhớ như đối số đầu tiên

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
44

Vì vậy,

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
235 có thể được sử dụng để gán cho trường
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
239 của
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
236 cấu trúc

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
45

Loại không đầy đủ¶

Các loại không đầy đủ là các cấu trúc, liên kết hoặc mảng có thành viên chưa được chỉ định. Trong C, chúng được chỉ định bởi các khai báo chuyển tiếp, được xác định sau

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
46

Bản dịch đơn giản sang mã ctypes sẽ là thế này, nhưng nó không hoạt động

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
47

bởi vì

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
246 mới không có sẵn trong chính câu lệnh lớp. Trong
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0, chúng ta có thể định nghĩa lớp
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
248 và đặt thuộc tính
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095 sau đó, sau câu lệnh lớp

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
48

Hãy thử nó. Chúng tôi tạo hai phiên bản của

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
248 và để chúng trỏ đến nhau và cuối cùng thực hiện theo chuỗi con trỏ một vài lần

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
49

Hàm gọi lại¶

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 cho phép tạo các con trỏ hàm có thể gọi C từ các hàm có thể gọi được của Python. Đôi khi chúng được gọi là các hàm gọi lại

Trước tiên, bạn phải tạo một lớp cho chức năng gọi lại. Lớp biết quy ước gọi, kiểu trả về, số lượng và kiểu đối số mà hàm này sẽ nhận

Hàm nhà máy

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
252 tạo các loại cho hàm gọi lại bằng cách sử dụng quy ước gọi
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
9. Trên Windows, hàm xuất xưởng
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
254 tạo các loại cho hàm gọi lại bằng cách sử dụng quy ước gọi
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
0

Cả hai hàm xuất xưởng này đều được gọi với loại kết quả làm đối số đầu tiên và các hàm gọi lại mong đợi loại đối số làm đối số còn lại

Tôi sẽ trình bày một ví dụ ở đây sử dụng hàm

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
256 của thư viện C tiêu chuẩn, được sử dụng để sắp xếp các mục với sự trợ giúp của hàm gọi lại.
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
256 sẽ được sử dụng để sắp xếp một mảng các số nguyên

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
50

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
256 phải được gọi với một con trỏ tới dữ liệu cần sắp xếp, số mục trong mảng dữ liệu, kích thước của một mục và một con trỏ tới hàm so sánh, gọi lại. Sau đó, cuộc gọi lại sẽ được gọi với hai con trỏ tới các mục và nó phải trả về một số nguyên âm nếu mục đầu tiên nhỏ hơn mục thứ hai, số 0 nếu chúng bằng nhau và một số nguyên dương nếu không

Vì vậy, hàm gọi lại của chúng tôi nhận con trỏ tới số nguyên và phải trả về số nguyên. Đầu tiên chúng ta tạo

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
259 cho chức năng gọi lại

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
51

Để bắt đầu, đây là một lệnh gọi lại đơn giản hiển thị các giá trị mà nó được truyền

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
52

Kết quả

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
53

Bây giờ chúng tôi thực sự có thể so sánh hai mục và trả về một kết quả hữu ích

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
54

Vì chúng ta có thể dễ dàng kiểm tra, mảng của chúng ta hiện đã được sắp xếp

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
55

Các nhà máy chức năng có thể được sử dụng làm nhà máy trang trí, vì vậy chúng tôi cũng có thể viết

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
56

Ghi chú

Đảm bảo rằng bạn giữ các tham chiếu đến các đối tượng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
252 miễn là chúng được sử dụng từ mã C.
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 thì không, và nếu bạn không, chúng có thể bị thu gom rác, làm hỏng chương trình của bạn khi gọi lại

Ngoài ra, hãy lưu ý rằng nếu chức năng gọi lại được gọi trong một luồng được tạo bên ngoài sự kiểm soát của Python [e. g. bởi mã nước ngoài gọi hàm gọi lại], ctypes tạo một luồng Python giả mới trên mỗi lệnh gọi. Hành vi này đúng với hầu hết các mục đích, nhưng điều đó có nghĩa là các giá trị được lưu trữ bằng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
262 sẽ không tồn tại qua các lệnh gọi lại khác nhau, ngay cả khi các lệnh gọi đó được thực hiện từ cùng một luồng C

Truy cập các giá trị được xuất từ ​​dlls¶

Một số thư viện dùng chung không chỉ xuất các hàm mà còn xuất các biến. Một ví dụ trong chính thư viện Python là

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
263, một số nguyên được đặt thành 0, 1 hoặc 2, tùy thuộc vào cờ
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
264 hoặc
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
265 được cung cấp khi khởi động

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 có thể truy cập các giá trị như thế này với các phương thức lớp
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
267 thuộc loại. pythonapi là một biểu tượng được xác định trước cấp quyền truy cập vào Python C api

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
57

Nếu trình thông dịch đã được bắt đầu với

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
264, thì mẫu sẽ được in
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
269 hoặc
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
270 nếu
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
265 đã được chỉ định

Một ví dụ mở rộng cũng minh họa việc sử dụng con trỏ truy cập con trỏ

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
272 được xuất bởi Python

Trích dẫn các tài liệu cho giá trị đó

Con trỏ này được khởi tạo để trỏ đến một mảng gồm các bản ghi

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
273, được kết thúc bởi một bản ghi có tất cả các thành viên là
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
013 hoặc 0. Khi một mô-đun bị đóng băng được nhập, nó sẽ được tìm kiếm trong bảng này. Mã của bên thứ ba có thể sử dụng thủ thuật này để cung cấp một bộ sưu tập các mô-đun cố định được tạo động

Vì vậy, thao tác con trỏ này thậm chí có thể hữu ích. Để hạn chế kích thước ví dụ, chúng tôi chỉ hiển thị cách đọc bảng này với

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
58

Chúng tôi đã xác định kiểu dữ liệu

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
273, vì vậy chúng tôi có thể lấy con trỏ tới bảng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
59

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
277 là một
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
278 của mảng bản ghi
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
279, nên chúng ta có thể lặp lại nó, nhưng chúng ta chỉ cần đảm bảo rằng vòng lặp của chúng ta kết thúc, vì con trỏ không có kích thước. Sớm muộn gì nó cũng có thể bị sập do vi phạm quyền truy cập hoặc bất cứ điều gì, vì vậy tốt hơn hết là thoát ra khỏi vòng lặp khi chúng tôi nhấn vào mục nhập
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
013

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
10

Thực tế là Python tiêu chuẩn có một mô-đun bị đóng băng và một gói bị đóng băng [được biểu thị bởi thành viên phủ định

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
281] không được biết rõ, nó chỉ được sử dụng để thử nghiệm. Hãy dùng thử với
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
282 chẳng hạn

ngạc nhiên¶

Có một số khía cạnh trong

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 mà bạn có thể mong đợi điều gì đó khác với những gì thực sự xảy ra

Xem xét ví dụ sau

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
11

hừm. Chúng tôi chắc chắn mong đợi tuyên bố cuối cùng để in

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
284. Chuyện gì đã xảy ra thế?

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
12

Lưu ý rằng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
286 và
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
287 là các đối tượng vẫn sử dụng bộ đệm bên trong của đối tượng
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
288 ở trên. Vì vậy, việc thực thi
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
289 sao chép nội dung bộ đệm của
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
286 vào bộ đệm của
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
288. Đến lượt nó, điều này thay đổi nội dung của
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
287. Vì vậy, nhiệm vụ cuối cùng
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
293, không có tác dụng như mong đợi

Hãy nhớ rằng việc truy xuất các đối tượng phụ từ Cấu trúc, Liên kết và Mảng không sao chép đối tượng phụ, thay vào đó, nó truy xuất một đối tượng trình bao đang truy cập vào bộ đệm bên dưới của đối tượng gốc

Một ví dụ khác có thể hoạt động khác với những gì người ta mong đợi là đây

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
13

Ghi chú

Các đối tượng được khởi tạo từ

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
045 chỉ có thể đặt giá trị của chúng thành byte hoặc số nguyên

Tại sao nó lại in

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
221? . Lưu trữ một đối tượng Python trong khối bộ nhớ không lưu trữ chính đối tượng đó, thay vào đó,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
212 của đối tượng được lưu trữ. Truy cập lại nội dung sẽ tạo một đối tượng Python mới mỗi lần.
descriptors accessing the contents of the memory. Storing a Python object in the memory block does not store the object itself, instead the
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
212 of the object is stored. Accessing the contents again constructs a new Python object each time!

Kiểu dữ liệu có kích thước thay đổi¶

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 cung cấp một số hỗ trợ cho các mảng và cấu trúc có kích thước thay đổi

Hàm

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
298 có thể được sử dụng để thay đổi kích thước bộ nhớ đệm của đối tượng ctypes hiện có. Hàm lấy đối tượng làm đối số đầu tiên và kích thước được yêu cầu tính bằng byte làm đối số thứ hai. Không thể tạo khối bộ nhớ nhỏ hơn khối bộ nhớ tự nhiên được chỉ định bởi loại đối tượng, một
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
016 sẽ xuất hiện nếu điều này được thử

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
14

Điều này là tốt và tốt, nhưng làm cách nào để truy cập các phần tử bổ sung có trong mảng này?

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
15

Một cách khác để sử dụng các loại dữ liệu có kích thước thay đổi với

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 là sử dụng tính chất động của Python và [xác định lại] loại dữ liệu sau khi đã biết kích thước yêu cầu, tùy từng trường hợp

tham chiếu ctypes¶

Tìm thư viện dùng chung¶

Khi lập trình bằng ngôn ngữ được biên dịch, các thư viện dùng chung được truy cập khi biên dịch/liên kết chương trình và khi chương trình được chạy

Mục đích của hàm

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
901 là định vị thư viện theo cách tương tự như những gì trình biên dịch hoặc trình tải thời gian chạy thực hiện [trên các nền tảng có một số phiên bản của thư viện dùng chung, phiên bản mới nhất sẽ được tải], trong khi trình tải thư viện ctypes hoạt động như khi một

Mô-đun

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
902 cung cấp chức năng có thể giúp xác định thư viện sẽ tải

ctypes. sử dụng. find_library[tên]

Cố gắng tìm thư viện và trả lại tên đường dẫn. tên là tên thư viện không có bất kỳ tiền tố nào như lib, hậu tố như

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
903,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
904 hoặc số phiên bản [đây là biểu mẫu được sử dụng cho tùy chọn trình liên kết posix
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
905]. Nếu không tìm thấy thư viện nào, trả về
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
014

Chức năng chính xác phụ thuộc vào hệ thống

Trên Linux,

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
901 cố chạy các chương trình bên ngoài [
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
908,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
909,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
910 và
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
911] để tìm tệp thư viện. Nó trả về tên tệp của tệp thư viện

Đã thay đổi trong phiên bản 3. 6. Trên Linux, giá trị của biến môi trường

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
912 được sử dụng khi tìm kiếm thư viện, nếu không thể tìm thấy thư viện bằng bất kỳ cách nào khác.

Dưới đây là một số ví dụ

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
16

Trên macOS,

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
901 thử một số sơ đồ đặt tên và đường dẫn được xác định trước để định vị thư viện và trả về tên đường dẫn đầy đủ nếu thành công

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
17

Trên Windows,

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
901 tìm kiếm dọc theo đường dẫn tìm kiếm của hệ thống và trả về tên đường dẫn đầy đủ, nhưng vì không có sơ đồ đặt tên được xác định trước nên lệnh gọi như
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
915 sẽ không thành công và trả về
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
014

Nếu bọc thư viện dùng chung bằng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0, có thể tốt hơn là xác định tên thư viện dùng chung tại thời điểm phát triển và mã hóa cứng tên đó vào mô-đun trình bao bọc thay vì sử dụng
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
901 để định vị thư viện khi chạy

Đang tải thư viện dùng chung¶

Có một số cách để tải các thư viện dùng chung vào quy trình Python. Một cách là khởi tạo một trong các lớp sau

lớp ctypes. CDLL[tên , chế độ=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None]

Các thực thể của lớp này đại diện cho các thư viện dùng chung đã tải. Các hàm trong các thư viện này sử dụng quy ước gọi C tiêu chuẩn và được giả định là trả về int .

Trên Windows, việc tạo phiên bản

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
919 có thể không thành công ngay cả khi tên DLL tồn tại. Khi không tìm thấy tệp DLL phụ thuộc của tệp DLL đã tải, lỗi
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
3 sẽ xuất hiện với thông báo “[WinError 126] Không thể tìm thấy mô-đun được chỉ định”. Thông báo lỗi này không chứa tên của tệp DLL bị thiếu vì API Windows không trả lại thông tin này khiến lỗi này khó chẩn đoán. Để khắc phục lỗi này và xác định không tìm thấy DLL nào, bạn cần tìm danh sách các DLL phụ thuộc và xác định xem không tìm thấy DLL nào bằng cách sử dụng các công cụ theo dõi và gỡ lỗi của Windows

Xem thêm

Microsoft DUMPBIN tool – Một công cụ để tìm DLL phụ thuộc

lớp ctypes. OleDLL[tên , chế độ=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None]

chỉ cửa sổ. Các phiên bản của lớp này đại diện cho các thư viện được chia sẻ đã tải, các hàm trong các thư viện này sử dụng quy ước gọi

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
0 và được cho là trả về mã
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
2 cụ thể của cửa sổ. Giá trị
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
2 chứa thông tin xác định lệnh gọi hàm thất bại hay thành công, cùng với mã lỗi bổ sung. Nếu giá trị trả về báo hiệu lỗi, một
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
3 sẽ tự động được nâng lên

Đã thay đổi trong phiên bản 3. 3. ______94 đã từng lớn lên.

lớp ctypes. WinDLL[tên , chế độ=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None]

Chỉ dành cho Windows. Các phiên bản của lớp này đại diện cho các thư viện dùng chung đã tải, các hàm trong các thư viện này sử dụng quy ước gọi

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
0 và được giả định trả về int theo mặc định.

Khóa trình thông dịch toàn cục của Python được giải phóng trước khi gọi bất kỳ chức năng nào do các thư viện này xuất và được yêu cầu lại sau đó.

lớp ctypes. PyDLL[tên , chế độ=DEFAULT_MODE, handle=None]

Các phiên bản của lớp này hoạt động giống như các phiên bản

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
919, ngoại trừ GIL Python không được giải phóng trong khi gọi hàm và sau khi thực thi chức năng, cờ lỗi Python được kiểm tra. Nếu cờ lỗi được đặt, một ngoại lệ Python sẽ xuất hiện

Do đó, điều này chỉ hữu ích khi gọi trực tiếp các hàm api của Python C

Tất cả các lớp này có thể được khởi tạo bằng cách gọi chúng với ít nhất một đối số, tên đường dẫn của thư viện dùng chung. Nếu bạn có sẵn một thẻ điều khiển cho một thư viện dùng chung đã được tải, thì nó có thể được chuyển dưới dạng tham số có tên là

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
928, nếu không, hàm
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
929 hoặc
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
930 của các nền tảng cơ bản được sử dụng để tải thư viện vào quy trình và để xử lý nó

Tham số chế độ có thể được sử dụng để chỉ định cách tải thư viện. Để biết chi tiết, tham khảo trang dlopen[3]. Trên Windows, chế độ bị bỏ qua. Trên các hệ thống posix, RTLD_NOW luôn được thêm vào và không thể định cấu hình

Tham số use_errno, khi được đặt thành true, sẽ bật cơ chế ctypes cho phép truy cập số lỗi

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
931 của hệ thống theo cách an toàn.
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 duy trì một bản sao luồng cục bộ của biến
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
931 của hệ thống;

Hàm

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
936 trả về giá trị của bản sao riêng của ctypes và hàm
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
937 thay đổi bản sao riêng của ctypes thành một giá trị mới và trả về giá trị cũ

Tham số use_last_error, khi được đặt thành true, sẽ kích hoạt cơ chế tương tự cho mã lỗi Windows được quản lý bởi các hàm API của Windows

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
085 và
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
939;

Tham số winmode được sử dụng trên Windows để chỉ định cách thư viện được tải [vì chế độ bị bỏ qua]. Nó nhận bất kỳ giá trị nào hợp lệ cho tham số cờ

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
942 API Win32. Khi bị bỏ qua, mặc định là sử dụng các cờ dẫn đến tải DLL an toàn nhất để tránh các sự cố như chiếm quyền điều khiển DLL. Chuyển đường dẫn đầy đủ tới DLL là cách an toàn nhất để đảm bảo tải đúng thư viện và các phụ thuộc

Đã thay đổi trong phiên bản 3. 8. Đã thêm tham số winmode.

ctypes. RTLD_GLOBAL

Gắn cờ để sử dụng làm tham số chế độ. Trên các nền tảng không có cờ này, nó được định nghĩa là số nguyên 0

ctypes. RTLD_LOCAL

Gắn cờ để sử dụng làm tham số chế độ. Trên các nền tảng không có tính năng này, nó giống như RTLD_GLOBAL

ctypes. DEFAULT_MODE

Chế độ mặc định được sử dụng để tải các thư viện dùng chung. Trên OSX10. 3, đây là RTLD_GLOBAL, nếu không thì nó giống như RTLD_LOCAL

Thể hiện của các lớp này không có phương thức công khai. Các chức năng được xuất bởi thư viện dùng chung có thể được truy cập dưới dạng thuộc tính hoặc theo chỉ mục. Xin lưu ý rằng việc truy cập hàm thông qua một thuộc tính sẽ lưu trữ kết quả và do đó, việc truy cập nó nhiều lần sẽ trả về cùng một đối tượng mỗi lần. Mặt khác, truy cập nó thông qua một chỉ mục sẽ trả về một đối tượng mới mỗi lần

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
18

Các thuộc tính công khai sau đây khả dụng, tên của chúng bắt đầu bằng dấu gạch dưới để không xung đột với tên hàm đã xuất

PyDLL. _handle

Tay cầm hệ thống dùng để truy cập thư viện

PyDLL. _name

Tên của thư viện được truyền trong hàm tạo

Các thư viện dùng chung cũng có thể được tải bằng cách sử dụng một trong các đối tượng đúc sẵn, là các thể hiện của lớp

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
943, bằng cách gọi phương thức
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
000 hoặc bằng cách truy xuất thư viện dưới dạng thuộc tính của thể hiện trình tải

lớp ctypes. Trình tải thư viện[dlltype]

Lớp tải thư viện dùng chung. dlltype phải là một trong các loại

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
919,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
946,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
947 hoặc
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
948

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
949 có hành vi đặc biệt. Nó cho phép tải một thư viện dùng chung bằng cách truy cập nó dưới dạng thuộc tính của một phiên bản trình tải thư viện. Kết quả được lưu trong bộ nhớ cache, do đó, các truy cập thuộc tính lặp lại sẽ trả về cùng một thư viện mỗi lần

LoadLibrary[tên]

Tải thư viện dùng chung vào quy trình và trả lại. Phương thức này luôn trả về một thể hiện mới của thư viện

Những bộ tải thư viện đúc sẵn này có sẵn

ctypes. cdll

Tạo các phiên bản

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
919

ctypes. gió

chỉ cửa sổ. Tạo các phiên bản

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
947

ctypes. oledll

chỉ cửa sổ. Tạo các phiên bản

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
948

ctypes. pydll

Tạo các phiên bản

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
946

Để truy cập trực tiếp vào api C Python, có sẵn đối tượng thư viện chia sẻ Python sẵn sàng sử dụng

ctypes. pythonapi

Một phiên bản của

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
946 hiển thị các hàm API Python C dưới dạng thuộc tính. Lưu ý rằng tất cả các hàm này được giả định là trả về C int , điều này tất nhiên không phải lúc nào cũng đúng, vì vậy bạn phải gán đúng thuộc tính
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
077 để sử dụng .

Việc tải thư viện thông qua bất kỳ đối tượng nào trong số này sẽ tạo ra một sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
956 với đối số chuỗi
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
957, tên được sử dụng để tải thư viện.

Việc truy cập một hàm trên thư viện đã tải sẽ làm phát sinh sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
958 với các đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
959 [đối tượng thư viện] và
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
957 [tên của ký hiệu dưới dạng chuỗi hoặc số nguyên]

Trong các trường hợp khi chỉ có thẻ điều khiển thư viện chứ không phải đối tượng, việc truy cập một hàm sẽ tạo ra sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
961 với các đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
928 [xử lý thư viện thô] và
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
957

Chức năng nước ngoài¶

Như đã giải thích trong phần trước, các chức năng nước ngoài có thể được truy cập dưới dạng thuộc tính của các thư viện dùng chung đã tải. Các đối tượng hàm được tạo theo cách này theo mặc định chấp nhận bất kỳ số lượng đối số nào, chấp nhận bất kỳ trường hợp dữ liệu ctypes nào làm đối số và trả về loại kết quả mặc định do trình tải thư viện chỉ định. Chúng là các thể hiện của một lớp riêng

lớp ctypes. _FuncPtr

Lớp cơ sở cho các chức năng nước ngoài có thể gọi được C

Các thể hiện của hàm ngoại cũng là kiểu dữ liệu tương thích với C;

Hành vi này có thể được tùy chỉnh bằng cách gán cho các thuộc tính đặc biệt của đối tượng chức năng nước ngoài

gõ lại

Gán loại ctypes để chỉ định loại kết quả của hàm ngoại. Sử dụng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
014 cho void , một hàm không trả về bất cứ thứ gì.

Có thể gán một đối tượng Python có thể gọi được không phải là loại ctypes, trong trường hợp này, hàm được giả sử trả về một C int, and the callable will be called with this integer, allowing further processing or error checking. Using this is deprecated, for more flexible post processing or error checking use a ctypes data type as

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
077 and assign a callable to the
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
086 attribute.

kiểu đối số

Chỉ định một bộ các loại ctypes để chỉ định các loại đối số mà hàm chấp nhận. Các hàm sử dụng quy ước gọi

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
0 chỉ có thể được gọi với cùng số lượng đối số bằng độ dài của bộ dữ liệu này;

Khi một hàm ngoại được gọi, mỗi đối số thực được truyền cho phương thức lớp

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
071 của các mục trong bộ
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
062, phương thức này cho phép điều chỉnh đối số thực cho một đối tượng mà hàm ngoại chấp nhận. Ví dụ: một mục
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
045 trong bộ
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
062 sẽ chuyển đổi một chuỗi được truyền dưới dạng đối số thành một đối tượng byte bằng cách sử dụng quy tắc chuyển đổi ctypes

Mới. Giờ đây, có thể đặt các mục trong các kiểu đối số không phải là kiểu ctypes, nhưng mỗi mục phải có một phương thức

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
071 trả về một giá trị có thể sử dụng làm đối số [số nguyên, chuỗi, phiên bản ctypes]. Điều này cho phép xác định các bộ điều hợp có thể điều chỉnh các đối tượng tùy chỉnh làm tham số chức năng

kiểm tra lỗi

Gán một hàm Python hoặc một hàm khác có thể gọi được cho thuộc tính này. Có thể gọi được sẽ được gọi với ba đối số trở lên

có thể gọi[kết quả , chức năng, arguments]

kết quả là những gì hàm ngoại trả về, như được chỉ định bởi thuộc tính

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
077

func là chính đối tượng chức năng nước ngoài, điều này cho phép sử dụng lại cùng một đối tượng có thể gọi được để kiểm tra hoặc đăng xử lý kết quả của một số chức năng

đối số là một bộ chứa các tham số ban đầu được truyền cho lời gọi hàm, điều này cho phép chuyên biệt hóa hành vi trên các đối số được sử dụng

Đối tượng mà hàm này trả về sẽ được trả về từ lệnh gọi hàm ngoại, nhưng nó cũng có thể kiểm tra giá trị kết quả và đưa ra một ngoại lệ nếu lệnh gọi hàm ngoại không thành công

ngoại lệ ctypes. Lỗi đối số

Ngoại lệ này được đưa ra khi lệnh gọi hàm nước ngoài không thể chuyển đổi một trong các đối số đã truyền

Trên Windows, khi lệnh gọi hàm nước ngoài phát sinh ngoại lệ hệ thống [ví dụ: do vi phạm quyền truy cập], nó sẽ bị bắt và thay thế bằng ngoại lệ Python phù hợp. Hơn nữa, một sự kiện kiểm toán

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
974 với đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
975 sẽ được nêu ra, cho phép móc kiểm tra thay thế ngoại lệ bằng chính nó

Một số cách gọi hàm ngoại lai có thể gây ra sự kiện kiểm toán

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
976 với các đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
977 và
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
978

Nguyên mẫu hàm¶

Các hàm lạ cũng có thể được tạo bằng cách khởi tạo nguyên mẫu hàm. Nguyên mẫu hàm tương tự như nguyên mẫu hàm trong C; . Các hàm xuất xưởng phải được gọi với loại kết quả mong muốn và các loại đối số của hàm, đồng thời có thể được sử dụng làm nhà máy trang trí và như vậy, được áp dụng cho các hàm thông qua cú pháp

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
979. Xem Hàm gọi lại để biết ví dụ.

ctypes. CFUNCTYPE[gõ lại , *argtypes, use_errno=False, use_last_error=False]

Nguyên mẫu hàm được trả về tạo các hàm sử dụng quy ước gọi C tiêu chuẩn. Chức năng sẽ giải phóng GIL trong khi gọi. Nếu use_errno được đặt thành true, bản sao riêng ctypes của biến

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
931 hệ thống được trao đổi với giá trị thực
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
931 trước và sau cuộc gọi;

ctypes. WINFUNCTYPE[gõ lại , *argtypes, use_errno=False, use_last_error=False]

chỉ cửa sổ. Nguyên mẫu hàm được trả về tạo ra các hàm sử dụng quy ước gọi

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
0. Chức năng sẽ giải phóng GIL trong khi gọi. use_errno và use_last_error có cùng ý nghĩa như trên

ctypes. PYFUNCTYPE[gõ lại , *argtypes]

Nguyên mẫu hàm được trả về tạo các hàm sử dụng quy ước gọi Python. Chức năng sẽ không giải phóng GIL trong khi gọi

Các nguyên mẫu hàm được tạo bởi các hàm gốc này có thể được khởi tạo theo nhiều cách khác nhau, tùy thuộc vào loại và số lượng tham số trong lệnh gọi

nguyên mẫu[địa chỉ]

Trả về một hàm nước ngoài tại địa chỉ đã chỉ định phải là một số nguyên

nguyên mẫu[có thể gọi được]

Tạo hàm có thể gọi C [hàm gọi lại] từ Python có thể gọi được

nguyên mẫu[func_spec[ , paramflags]]

Trả về một hàm nước ngoài được xuất bởi một thư viện dùng chung. func_spec phải là 2-tuple

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
983. Mục đầu tiên là tên của hàm được xuất dưới dạng chuỗi hoặc thứ tự của hàm được xuất dưới dạng số nguyên nhỏ. Mục thứ hai là phiên bản thư viện được chia sẻ

nguyên mẫu[vtbl_index , tên[, paramflags[, iid]]]

Trả về một hàm nước ngoài sẽ gọi một phương thức COM. vtbl_index là chỉ số vào bảng hàm ảo, một số nguyên nhỏ không âm. name là tên của phương thức COM. iid là một con trỏ tùy chọn tới mã định danh giao diện được sử dụng trong báo cáo lỗi mở rộng

Các phương thức COM sử dụng một quy ước gọi đặc biệt. Chúng yêu cầu một con trỏ tới giao diện COM làm đối số đầu tiên, ngoài các tham số được chỉ định trong bộ dữ liệu

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
062

Tham số paramflags tùy chọn tạo các trình bao bọc hàm nước ngoài với nhiều chức năng hơn các tính năng được mô tả ở trên

paramflags phải là một bộ có cùng độ dài với

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
062

Mỗi mục trong bộ này chứa thêm thông tin về một tham số, nó phải là một bộ chứa một, hai hoặc ba mục

Mục đầu tiên là một số nguyên chứa tổ hợp các cờ hướng cho tham số

1

Chỉ định tham số đầu vào cho hàm

2

tham số đầu ra. Hàm ngoại điền vào một giá trị

4

Tham số đầu vào mặc định là số nguyên

Mục thứ hai tùy chọn là tên tham số dưới dạng chuỗi. Nếu điều này được chỉ định, chức năng nước ngoài có thể được gọi với các tham số được đặt tên

Mục thứ ba tùy chọn là giá trị mặc định cho tham số này

Ví dụ này trình bày cách bọc chức năng Windows

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
986 để nó hỗ trợ các tham số mặc định và các đối số được đặt tên. Khai báo C từ tệp tiêu đề windows là đây

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
19

Đây là gói với

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
50

Chức năng nước ngoài

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
988 hiện có thể được gọi theo những cách này

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
51

Một ví dụ thứ hai minh họa các tham số đầu ra. Hàm win32

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
989 truy xuất kích thước của một cửa sổ đã chỉ định bằng cách sao chép chúng vào cấu trúc
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
990 mà người gọi phải cung cấp. Đây là khai báo C

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
52

Đây là gói với

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
53

Các hàm có tham số đầu ra sẽ tự động trả về giá trị tham số đầu ra nếu có một giá trị duy nhất hoặc một bộ chứa các giá trị tham số đầu ra khi có nhiều hơn một giá trị, vì vậy hàm GetWindowRect hiện trả về một phiên bản RECT khi được gọi

Các tham số đầu ra có thể được kết hợp với giao thức

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
086 để thực hiện thêm quá trình xử lý đầu ra và kiểm tra lỗi. Hàm api win32
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
989 trả về một
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
994 để báo hiệu thành công hay thất bại, vì vậy hàm này có thể thực hiện kiểm tra lỗi và đưa ra một ngoại lệ khi lệnh gọi api không thành công

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
54

Nếu hàm

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
086 trả về bộ đối số mà nó nhận được không thay đổi, thì
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 sẽ tiếp tục quá trình xử lý bình thường mà nó thực hiện trên các tham số đầu ra. Nếu bạn muốn trả về một bộ tọa độ cửa sổ thay vì một phiên bản
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
990, bạn có thể truy xuất các trường trong hàm và trả lại chúng, quá trình xử lý thông thường sẽ không diễn ra nữa

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
55

Các chức năng tiện ích¶

ctypes. địa chỉ của[đối tượng]

Trả về địa chỉ của bộ nhớ đệm dưới dạng số nguyên. obj phải là một thể hiện của kiểu ctypes

Tăng sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
998 với đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
999.

ctypes. căn chỉnh[obj_or_type]

Trả về các yêu cầu căn chỉnh của một loại ctypes. obj_or_type phải là loại ctypes hoặc thể hiện

ctypes. byref[obj[ , offset]]

Trả về một con trỏ light-weight cho obj, con trỏ này phải là một thể hiện của kiểu ctypes. offset mặc định bằng 0 và phải là số nguyên sẽ được thêm vào giá trị con trỏ bên trong

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
400 tương ứng với mã C này

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
56

Đối tượng được trả về chỉ có thể được sử dụng làm tham số gọi hàm nước ngoài. Nó hoạt động tương tự như

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
401, nhưng việc xây dựng nhanh hơn rất nhiều

ctypes. truyền[đối tượng , loại]

Hàm này tương tự như toán tử ép kiểu trong C. Nó trả về một phiên bản mới của loại trỏ đến cùng một khối bộ nhớ như obj. loại phải là loại con trỏ và obj phải là đối tượng có thể được hiểu là con trỏ

ctypes. create_string_buffer[init_or_size , size=None]

Hàm này tạo bộ đệm ký tự có thể thay đổi. Đối tượng được trả về là một mảng ctypes của

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
028

init_or_size phải là một số nguyên chỉ định kích thước của mảng hoặc một đối tượng byte sẽ được sử dụng để khởi tạo các mục mảng

Nếu một đối tượng byte được chỉ định làm đối số đầu tiên, thì bộ đệm được tạo một mục lớn hơn độ dài của nó để phần tử cuối cùng trong mảng là ký tự kết thúc NUL. Một số nguyên có thể được truyền dưới dạng đối số thứ hai, cho phép chỉ định kích thước của mảng nếu không nên sử dụng độ dài của byte

Tăng sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
403 với các đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
404,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
281.

ctypes. create_unicode_buffer[init_or_size , size=None]

Hàm này tạo bộ đệm ký tự unicode có thể thay đổi. Đối tượng được trả về là một mảng ctypes của

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
029

init_or_size phải là một số nguyên chỉ định kích thước của mảng hoặc một chuỗi sẽ được sử dụng để khởi tạo các mục mảng

Nếu một chuỗi được chỉ định làm đối số đầu tiên, bộ đệm được tạo một mục lớn hơn độ dài của chuỗi sao cho phần tử cuối cùng trong mảng là ký tự kết thúc NUL. Một số nguyên có thể được truyền dưới dạng đối số thứ hai, cho phép chỉ định kích thước của mảng nếu không nên sử dụng độ dài của chuỗi

Tăng sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
407 với các đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
404,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
281.

ctypes. DllCanUnloadNow[]

chỉ cửa sổ. Chức năng này là một hook cho phép triển khai các máy chủ COM đang xử lý với ctypes. Nó được gọi từ hàm DllCanUnloadNow mà dll mở rộng _ctypes xuất

ctypes. DllGetClassObject[]

chỉ cửa sổ. Chức năng này là một hook cho phép triển khai các máy chủ COM đang xử lý với ctypes. Nó được gọi từ hàm DllGetClassObject mà dll mở rộng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
410 xuất

ctypes. sử dụng. find_library[tên]

Cố gắng tìm thư viện và trả lại tên đường dẫn. name là tên thư viện không có bất kỳ tiền tố nào như

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
411, hậu tố như
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
903,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
904 hoặc số phiên bản [đây là biểu mẫu được sử dụng cho tùy chọn trình liên kết posix
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
905]. Nếu không tìm thấy thư viện nào, trả về
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
014

Chức năng chính xác phụ thuộc vào hệ thống

ctypes. sử dụng. find_msvcrt[]

chỉ cửa sổ. trả lại tên tệp của thư viện thời gian chạy VC được sử dụng bởi Python và bởi các mô-đun mở rộng. Nếu không xác định được tên thư viện, trả về ____2014

Ví dụ: nếu bạn cần giải phóng bộ nhớ, được cấp phát bởi một mô-đun mở rộng bằng lệnh gọi tới

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
417, thì điều quan trọng là bạn phải sử dụng hàm trong cùng thư viện đã cấp phát bộ nhớ

ctypes. Lỗi định dạng[[]]

chỉ cửa sổ. Trả về mô tả bằng văn bản của mã mã lỗi. Nếu không có mã lỗi nào được chỉ định, mã lỗi cuối cùng được sử dụng bằng cách gọi hàm api Windows GetLastError

ctypes. GetLastError[]

chỉ cửa sổ. Trả về mã lỗi cuối cùng do Windows đặt trong chuỗi cuộc gọi. Hàm này gọi trực tiếp hàm Windows

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
085, nó không trả về bản sao mã lỗi ctypes-private

ctypes. get_errno[]

Trả về giá trị hiện tại của bản sao ctypes-private của biến

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
931 hệ thống trong luồng gọi

Tăng sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
420 mà không có đối số.

ctypes. get_last_error[]

chỉ cửa sổ. trả về giá trị hiện tại của bản sao ctypes-private của biến

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
421 hệ thống trong luồng gọi

Tăng sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
422 không có đối số.

ctypes. memmove[dst , src, count]

Giống như chức năng thư viện C memmove tiêu chuẩn. bản sao đếm byte từ src đến dst. dst và src phải là các trường hợp số nguyên hoặc ctypes có thể được chuyển đổi thành con trỏ

ctypes. bộ nhớ[dst , c, count]

Giống như chức năng thư viện bộ nhớ C tiêu chuẩn. lấp đầy khối bộ nhớ tại địa chỉ dst với số byte giá trị c. dst phải là một số nguyên chỉ định một địa chỉ hoặc một phiên bản ctypes

ctypes. POINTER[loại]

Hàm xuất xưởng này tạo và trả về một loại con trỏ ctypes mới. Các loại con trỏ được lưu vào bộ nhớ cache và được sử dụng lại trong nội bộ, vì vậy việc gọi hàm này nhiều lần sẽ rẻ. loại phải là loại ctypes

ctypes. con trỏ[obj]

Hàm này tạo một thể hiện con trỏ mới, trỏ tới obj. Đối tượng được trả về thuộc loại

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
423

Ghi chú. Nếu bạn chỉ muốn chuyển một con trỏ tới một đối tượng cho một lệnh gọi hàm lạ, bạn nên sử dụng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
424 nhanh hơn nhiều

ctypes. thay đổi kích thước[obj , kích thước]

Hàm này thay đổi kích thước bộ đệm bộ nhớ trong của obj, đây phải là một phiên bản của loại ctypes. Không thể làm cho bộ đệm nhỏ hơn kích thước gốc của loại đối tượng, như được cung cấp bởi

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
425, nhưng có thể phóng to bộ đệm

ctypes. set_errno[giá trị]

Đặt giá trị hiện tại của bản sao ctypes-private của biến

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
931 hệ thống trong luồng gọi thành giá trị và trả về giá trị trước đó

Tăng sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
427 với đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
931.

ctypes. set_last_error[giá trị]

chỉ cửa sổ. đặt giá trị hiện tại của bản sao ctypes-private của biến

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
421 hệ thống trong luồng gọi thành giá trị và trả về giá trị trước đó

Tăng sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
430 với đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
431.

ctypes. sizeof[obj_or_type]

Trả về kích thước tính bằng byte của loại ctypes hoặc bộ đệm bộ nhớ thể hiện. Làm giống như toán tử C

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
432

ctypes. string_at[địa chỉ , kích thước=- 1]

Hàm này trả về chuỗi C bắt đầu tại địa chỉ địa chỉ bộ nhớ dưới dạng đối tượng byte. Nếu kích thước được chỉ định, thì nó được sử dụng làm kích thước, nếu không thì chuỗi được coi là không kết thúc

Tăng sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
433 với các đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
434,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
281.

ctypes. WinError[=Không, descr=None]

chỉ cửa sổ. chức năng này có lẽ là thứ tồi tệ nhất trong ctypes. Nó tạo ra một thể hiện của OSError. Nếu mã không được chỉ định,

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
436 được gọi để xác định mã lỗi. Nếu descr không được chỉ định,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
437 được gọi để nhận mô tả bằng văn bản về lỗi

Đã thay đổi trong phiên bản 3. 3. Một phiên bản của

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
4 đã từng được tạo.

ctypes. wstring_at[địa chỉ , kích thước=- 1]

Hàm này trả về chuỗi ký tự rộng bắt đầu từ địa chỉ địa chỉ bộ nhớ dưới dạng chuỗi. Nếu kích thước được chỉ định, thì nó được sử dụng làm số ký tự của chuỗi, nếu không thì chuỗi được coi là không kết thúc

Tăng sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
439 với các đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
434,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
281.

Loại dữ liệu¶

lớp ctypes. _CData

Lớp không công khai này là lớp cơ sở chung của tất cả các kiểu dữ liệu ctypes. Trong số những thứ khác, tất cả các phiên bản loại ctypes chứa một khối bộ nhớ chứa dữ liệu tương thích với C; . Một biến thể hiện khác được hiển thị là

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
443;

Các phương thức phổ biến của kiểu dữ liệu ctypes, đây đều là các phương thức của lớp [chính xác thì chúng là các phương thức của siêu lớp ].

from_buffer[nguồn[ , offset]]

Phương thức này trả về một thể hiện ctypes chia sẻ bộ đệm của đối tượng nguồn. Đối tượng nguồn phải hỗ trợ giao diện bộ đệm có thể ghi. Tham số offset tùy chọn chỉ định một offset vào bộ đệm nguồn theo byte; . Nếu bộ đệm nguồn không đủ lớn,

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
016 sẽ được nâng lên

Tăng sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
445 với các đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
278,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
281,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
448.

from_buffer_copy[nguồn[ , offset]]

Phương thức này tạo một thể hiện ctypes, sao chép bộ đệm từ bộ đệm đối tượng nguồn phải có thể đọc được. Tham số offset tùy chọn chỉ định một offset vào bộ đệm nguồn theo byte; . Nếu bộ đệm nguồn không đủ lớn,

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
016 sẽ được nâng lên

Tăng sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
445 với các đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
278,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
281,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
448.

from_address[địa chỉ]

Phương thức này trả về một thể hiện kiểu ctypes sử dụng bộ nhớ được chỉ định bởi địa chỉ phải là một số nguyên

Phương thức này và các phương thức khác gián tiếp gọi phương thức này, tạo ra một sự kiện kiểm tra

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
454 với đối số
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
434.

from_param[obj]

Phương pháp này điều chỉnh obj thành loại ctypes. Nó được gọi với đối tượng thực tế được sử dụng trong lệnh gọi hàm ngoại khi loại có trong bộ dữ liệu

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
062 của hàm ngoại;

Tất cả các kiểu dữ liệu ctypes đều có triển khai mặc định của phương thức lớp này thường trả về obj nếu đó là một thể hiện của kiểu. Một số loại cũng chấp nhận các đối tượng khác

in_dll[thư viện , tên]

Phương thức này trả về một thể hiện kiểu ctypes được xuất bởi một thư viện dùng chung. tên là tên của biểu tượng xuất dữ liệu, thư viện là thư viện được chia sẻ đã tải

Các biến thể hiện phổ biến của kiểu dữ liệu ctypes

_b_base_

Đôi khi các phiên bản dữ liệu ctypes không sở hữu khối bộ nhớ mà chúng chứa, thay vào đó chúng chia sẻ một phần khối bộ nhớ của một đối tượng cơ sở. Thành viên chỉ đọc

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
457 là đối tượng ctypes gốc sở hữu khối bộ nhớ

_b_needsfree_

Biến chỉ đọc này là đúng khi cá thể dữ liệu ctypes đã tự cấp phát khối bộ nhớ, ngược lại là sai

_đối tượng

Thành viên này là

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
014 hoặc một từ điển chứa các đối tượng Python cần được duy trì để nội dung khối bộ nhớ được giữ hợp lệ. Đối tượng này chỉ được hiển thị để gỡ lỗi;

Các kiểu dữ liệu cơ bản¶

lớp ctypes. _SimpleCData

Lớp không công khai này là lớp cơ sở của tất cả các kiểu dữ liệu ctypes cơ bản. Nó được đề cập ở đây vì nó chứa các thuộc tính chung của các kiểu dữ liệu ctypes cơ bản.

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
459 là lớp con của
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
460 nên nó kế thừa các phương thức và thuộc tính của chúng. các loại dữ liệu ctypes không và không chứa con trỏ giờ đây có thể được chọn

Các trường hợp có một thuộc tính duy nhất

giá trị

Thuộc tính này chứa giá trị thực của thể hiện. Đối với các loại số nguyên và con trỏ, nó là một số nguyên, đối với các loại ký tự, nó là một đối tượng hoặc chuỗi byte ký tự đơn, đối với các loại con trỏ ký tự, nó là một đối tượng hoặc chuỗi byte Python

Khi thuộc tính

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
056 được truy xuất từ ​​một phiên bản ctypes, thường thì một đối tượng mới được trả về mỗi lần.
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 không triển khai trả về đối tượng ban đầu, luôn tạo đối tượng mới. Điều này cũng đúng với tất cả các trường hợp đối tượng ctypes khác

Các kiểu dữ liệu cơ bản, khi được trả về dưới dạng kết quả gọi hàm ngoại, hoặc, ví dụ, bằng cách truy xuất các thành viên trường cấu trúc hoặc các mục mảng, được chuyển đổi rõ ràng thành các kiểu Python gốc. Nói cách khác, nếu một hàm nước ngoài có

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
077 của
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
045, bạn sẽ luôn nhận được một đối tượng byte Python, không phải là một phiên bản
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
045

Các lớp con của các kiểu dữ liệu cơ bản không kế thừa hành vi này. Vì vậy, nếu một hàm ngoại

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
077 là một lớp con của
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
049, bạn sẽ nhận được một thể hiện của lớp con này từ lời gọi hàm. Tất nhiên, bạn có thể lấy giá trị của con trỏ bằng cách truy cập thuộc tính
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
056

Đây là những kiểu dữ liệu ctypes cơ bản

lớp ctypes. c_byte

Đại diện cho kiểu dữ liệu C signed char và diễn giải giá trị dưới dạng số nguyên nhỏ. Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; .

lớp ctypes. c_char

Đại diện cho kiểu dữ liệu C char và diễn giải giá trị dưới dạng một ký tự. Hàm tạo chấp nhận một trình khởi tạo chuỗi tùy chọn, độ dài của chuỗi phải chính xác là một ký tự.

lớp ctypes. c_char_p

Đại diện cho kiểu dữ liệu C char* khi nó trỏ đến một chuỗi có tận cùng bằng 0. Đối với một con trỏ ký tự chung cũng có thể trỏ đến dữ liệu nhị phân, phải sử dụng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
469. Hàm tạo chấp nhận một địa chỉ số nguyên hoặc đối tượng byte.

lớp ctypes. c_double

Đại diện cho kiểu dữ liệu C double . Hàm tạo chấp nhận một trình khởi tạo float tùy chọn.

lớp ctypes. c_longdouble

Đại diện cho kiểu dữ liệu C long double . Hàm tạo chấp nhận một trình khởi tạo float tùy chọn. Trên các nền tảng có

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
470, đó là bí danh của
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
043.

lớp ctypes. c_float

Đại diện cho kiểu dữ liệu C float . Hàm tạo chấp nhận một trình khởi tạo float tùy chọn.

lớp ctypes. c_int

Đại diện cho kiểu dữ liệu C signed int . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; . Trên các nền tảng có

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
472, đó là bí danh của
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
5.

lớp ctypes. c_int8

Đại diện cho kiểu dữ liệu C 8-bit signed int . Thường là bí danh cho

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
030.

lớp ctypes. c_int16

Đại diện cho kiểu dữ liệu C 16-bit signed int . Thường là bí danh cho

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
032.

lớp ctypes. c_int32

Đại diện cho kiểu dữ liệu C 32-bit signed int . Thường là bí danh cho

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
3.

lớp ctypes. c_int64

Đại diện cho kiểu dữ liệu C 64-bit signed int . Thường là bí danh cho

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
038.

lớp ctypes. c_long

Đại diện cho kiểu dữ liệu C signed long . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; .

lớp ctypes. c_longlong

Đại diện cho kiểu dữ liệu C signed long long . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; .

lớp ctypes. c_short

Đại diện cho kiểu dữ liệu C signed short . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; .

lớp ctypes. c_size_t

Đại diện cho kiểu dữ liệu C

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
478

lớp ctypes. c_ssize_t

Đại diện cho kiểu dữ liệu C

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
479

Mới trong phiên bản 3. 2

lớp ctypes. c_ubyte

Đại diện cho kiểu dữ liệu C unsigned char , nó diễn giải giá trị dưới dạng số nguyên nhỏ. Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; .

lớp ctypes. c_uint

Đại diện cho kiểu dữ liệu C unsigned int . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; . Trên các nền tảng có

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
472, đó là bí danh của
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
037.

lớp ctypes. c_uint8

Đại diện cho kiểu dữ liệu C 8-bit unsigned int . Thường là bí danh cho

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
031.

lớp ctypes. c_uint16

Đại diện cho kiểu dữ liệu C 16-bit unsigned int . Thường là bí danh cho

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
033.

lớp ctypes. c_uint32

Đại diện cho kiểu dữ liệu C 32-bit unsigned int . Thường là bí danh cho

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
035.

lớp ctypes. c_uint64

Đại diện cho kiểu dữ liệu C 64-bit unsigned int . Thường là bí danh cho

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
039.

lớp ctypes. c_ulong

Đại diện cho kiểu dữ liệu C unsigned long . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; .

lớp ctypes. c_ulonglong

Đại diện cho kiểu dữ liệu C unsigned long long . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; .

lớp ctypes. c_ushort

Đại diện cho kiểu dữ liệu C unsigned short . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; .

lớp ctypes. c_void_p

Đại diện cho loại C void* . Giá trị được biểu diễn dưới dạng số nguyên. Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn.

lớp ctypes. c_wchar

Đại diện cho kiểu dữ liệu C wchar_t và diễn giải giá trị dưới dạng một chuỗi unicode ký tự đơn. Hàm tạo chấp nhận một trình khởi tạo chuỗi tùy chọn, độ dài của chuỗi phải chính xác là một ký tự.

lớp ctypes. c_wchar_p

Đại diện cho kiểu dữ liệu C wchar_t* , kiểu dữ liệu này phải là một con trỏ tới một chiều rộng kết thúc bằng 0 . Hàm tạo chấp nhận một địa chỉ số nguyên hoặc một chuỗi.

lớp ctypes. c_bool

Đại diện cho kiểu dữ liệu C bool [chính xác hơn là _Bool from C99]. Its value can be

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
486 or
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
221, and the constructor accepts any object that has a truth value.

lớp ctypes. HỆ QUẢ

chỉ cửa sổ. Đại diện cho một giá trị

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
2, chứa thông tin thành công hoặc lỗi cho một hàm hoặc phương thức gọi

lớp ctypes. py_object

Đại diện cho kiểu dữ liệu C PyObject* . Gọi điều này mà không có đối số sẽ tạo ra một con trỏ

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
013 PyObject* .

Mô-đun

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
490 cung cấp khá nhiều loại dữ liệu cụ thể khác của Windows, ví dụ:
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
491,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
492 hoặc
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
493. Một số cấu trúc hữu ích như
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
494 hoặc
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
990 cũng được định nghĩa

Kiểu dữ liệu có cấu trúc¶

lớp ctypes. Liên minh[*args , **kw]

Lớp cơ sở trừu tượng cho các công đoàn theo thứ tự byte gốc

lớp ctypes. BigEndianUnion[*args , **kw]

Lớp cơ sở trừu tượng cho các công đoàn theo thứ tự byte cuối lớn

Mới trong phiên bản 3. 11

lớp ctypes. LittleEndianUnion[*args , **kw]

Lớp cơ sở trừu tượng cho các công đoàn theo thứ tự byte cuối nhỏ

Mới trong phiên bản 3. 11

lớp ctypes. BigEndianStructure[*args , **kw]

Lớp cơ sở trừu tượng cho các cấu trúc theo thứ tự byte cuối lớn

lớp ctypes. LittleEndianStructure[*args , **kw]

Lớp cơ sở trừu tượng cho các cấu trúc theo thứ tự byte cuối nhỏ

Các cấu trúc và liên kết với thứ tự byte không phải gốc không thể chứa các trường loại con trỏ hoặc bất kỳ loại dữ liệu nào khác có chứa các trường loại con trỏ

lớp ctypes. Cấu trúc[*args , **kw]

Lớp cơ sở trừu tượng cho các cấu trúc theo thứ tự byte gốc

Các kiểu liên kết và cấu trúc cụ thể phải được tạo bằng cách phân lớp con của một trong các kiểu này và ít nhất là xác định một biến lớp

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095.
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 sẽ tạo bộ mô tả cho phép đọc và ghi các trường bằng cách truy cập thuộc tính trực tiếp. Đây là

_fields_

Trình tự xác định các trường cấu trúc. Các mục phải là 2-bộ hoặc 3-bộ. Mục đầu tiên là tên của trường, mục thứ hai chỉ định loại trường;

Đối với các trường loại số nguyên như

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
3, có thể cung cấp mục tùy chọn thứ ba. Nó phải là một số nguyên dương nhỏ xác định độ rộng bit của trường

Tên trường phải là duy nhất trong một cấu trúc hoặc liên kết. Điều này không được kiểm tra, chỉ có thể truy cập một trường khi tên được lặp lại

Có thể định nghĩa biến lớp

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095 sau câu lệnh lớp định nghĩa lớp con Cấu trúc, điều này cho phép tạo các kiểu dữ liệu trực tiếp hoặc gián tiếp tham chiếu đến chính chúng

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
57

Tuy nhiên, biến lớp

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095 phải được xác định trước khi loại được sử dụng lần đầu tiên [một thể hiện được tạo,
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
501 được gọi trên nó, v.v.]. Các phép gán sau này cho biến lớp
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095 sẽ gây ra AttributeError

Có thể định nghĩa các lớp con con của các kiểu cấu trúc, chúng kế thừa các trường của lớp cơ sở cộng với

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095 được định nghĩa trong lớp con con, nếu có

_pack_

Một số nguyên nhỏ tùy chọn cho phép ghi đè căn chỉnh của các trường cấu trúc trong ví dụ.

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
201 phải được xác định khi
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095 được chỉ định, nếu không nó sẽ không có hiệu lực

_anonymous_

Một chuỗi tùy chọn liệt kê tên của các trường chưa được đặt tên [ẩn danh].

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
506 phải được xác định trước khi gán
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095, nếu không nó sẽ không có hiệu lực

Các trường được liệt kê trong biến này phải là trường kiểu cấu trúc hoặc liên kết.

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 sẽ tạo các bộ mô tả theo kiểu cấu trúc cho phép truy cập trực tiếp các trường lồng nhau mà không cần tạo cấu trúc hoặc trường hợp

Đây là một loại ví dụ [Windows]

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
58

Cấu trúc

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
509 mô tả kiểu dữ liệu COM, trường
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
510 chỉ định trường hợp nào hợp lệ. Vì trường
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
511 được xác định là trường ẩn danh, nên giờ đây có thể truy cập trực tiếp vào các thành viên từ phiên bản TYPEDESC.
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
512 và
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
513 là tương đương, nhưng cái trước nhanh hơn vì nó không cần tạo một thể hiện hợp nhất tạm thời

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
59

Có thể định nghĩa các lớp con của cấu trúc, chúng kế thừa các trường của lớp cơ sở. Nếu định nghĩa lớp con có một biến

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095 riêng biệt, thì các trường được chỉ định trong phần này sẽ được thêm vào các trường của lớp cơ sở

Các hàm tạo cấu trúc và liên kết chấp nhận cả đối số vị trí và từ khóa. Các đối số vị trí được sử dụng để khởi tạo các trường thành viên theo cùng thứ tự như chúng xuất hiện trong

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095. Các đối số từ khóa trong hàm tạo được hiểu là các phép gán thuộc tính, vì vậy chúng sẽ khởi tạo
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095 với cùng tên hoặc tạo các thuộc tính mới cho các tên không có trong
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
095

Mảng và con trỏ¶

lớp ctypes. Mảng[*args]

Lớp cơ sở trừu tượng cho mảng

Cách khuyến nghị để tạo các kiểu mảng cụ thể là nhân bất kỳ kiểu dữ liệu

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
0 nào với một số nguyên không âm. Ngoài ra, bạn có thể phân lớp loại này và xác định các biến lớp
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
519 và
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
520. Các phần tử mảng có thể được đọc và ghi bằng cách sử dụng các truy cập lát cắt và chỉ số con tiêu chuẩn;

_length_

Một số nguyên dương xác định số phần tử trong mảng. Các chỉ số nằm ngoài phạm vi dẫn đến

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
522. Sẽ được trả lại bởi
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
523

_type_

Chỉ định kiểu của từng phần tử trong mảng

Các hàm tạo của lớp con mảng chấp nhận các đối số vị trí, được sử dụng để khởi tạo các phần tử theo thứ tự

lớp ctypes. _Con trỏ

Lớp cơ sở trừu tượng, riêng tư cho con trỏ

Các loại con trỏ cụ thể được tạo bằng cách gọi

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
217 với loại sẽ được trỏ tới;

Nếu một con trỏ trỏ đến một mảng, các phần tử của nó có thể được đọc và ghi bằng cách sử dụng các truy cập lát cắt và chỉ số con tiêu chuẩn. Các đối tượng con trỏ không có kích thước, vì vậy

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
523 sẽ tăng
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
527. Các chỉ số âm sẽ đọc từ bộ nhớ trước con trỏ [như trong C] và các chỉ số ngoài phạm vi có thể sẽ bị lỗi do vi phạm quyền truy cập [nếu bạn may mắn]

_type_

Chỉ định loại trỏ đến

nội dung

Trả về đối tượng mà con trỏ trỏ tới. Việc gán cho thuộc tính này sẽ thay đổi con trỏ trỏ đến đối tượng được gán

Tại sao con trỏ không được sử dụng trong Python?

Python có xu hướng cố gắng trừu tượng hóa các chi tiết triển khai như địa chỉ bộ nhớ từ người dùng của nó. Python thường tập trung vào khả năng sử dụng thay vì tốc độ . Kết quả là, con trỏ trong Python không thực sự có ý nghĩa. Mặc dù vậy, đừng sợ, theo mặc định, Python cung cấp cho bạn một số lợi ích của việc sử dụng con trỏ.

Các loại con trỏ có được hỗ trợ trong Python không?

Không, chúng tôi không có bất kỳ loại Con trỏ nào trong ngôn ngữ Python . Các đối tượng được truyền cho hàm theo tham chiếu. Cơ chế được sử dụng trong Python giống hệt như truyền con trỏ theo giá trị trong C. Chúng tôi có các biến Python không phải là con trỏ.

Tại sao con trỏ không được sử dụng trong Java và Python?

Vì vậy, tổng thể Java không có con trỏ [theo nghĩa C/C++] bởi vì nó không cần chúng cho lập trình OOP mục đích chung. Furthermore, adding pointers to Java would undermine security and robustness and make the language more complex.

Tại sao con trỏ được sử dụng trong Python?

Con trỏ có thể được coi là tên - tức là các mục nhập trong không gian tên của Python - tương ứng với các đối tượng trong bộ nhớ của Python . Trong ví dụ trên, con trỏ là my_string và đối tượng trong bộ nhớ là chuỗi có giá trị "Hello World. ".

Chủ Đề