Có con trỏ hàm trong Python không?

Tôi đang cố gắng liên kết thư viện c với python. Thư viện sử dụng rất nhiều con trỏ hàm chung

int arraylist_index_of[ArrayList *arraylist,

gọi lại ArrayListEqualFunc,

for [i=0; ilength; ++i] {

nếu [gọi lại [danh sách mảng-> dữ liệu [i], dữ liệu]. = 0]

và nguyên mẫu của ArrayListEqualFunc là.  

typedef int [*ArrayListEqualFunc][ArrayListValue value1, ArrayListValue value2];

cdef bên ngoài từ "calg/src/arraylist. h"

ctypedef bint [*ArrayListEqualFunc][

ArrayListValue value1, ArrayListValue value2

cdef int _indexof[self, EQUALFUNC cmp_func, mục đối tượng]

danh sách trả về. danh sách mảng_index_of[

bản thân. __c_array_list, cmp_func,mục

tự trở về. _indexof[toán tử. eq, mục]

Biên dịch calgdqueue. pyx vì nó đã thay đổi

Biên dịch danh sách mảng. pyx vì nó đã thay đổi

[1/2] Cythonizing danh sách mảng. pyx

Lỗi biên dịch tệp Cython

--------------------------------------------------

danh sách trả về. danh sách mảng_index_of[

bản thân. __c_array_list, cmp_func,mục

tự trở về. _indexof[toán tử. eq, mục]

--------------------------------------------------

lập danh sách. pyx. 58. 29. Các đối tượng Python không thể truyền tới các con trỏ kiểu nguyên thủy

Traceback [cuộc gọi gần đây nhất cuối cùng]

Tập tin "thiết lập. py", dòng 15, trong

ext_modules=cythonize[ext_modules]

Tệp "/usr/lib/python3. 6/site-gói/Cython/Build/Phụ thuộc. py", dòng 934, trong cythonize

Tệp "/usr/lib/python3. 6/site-gói/Cython/Build/Phụ thuộc. py", dòng 1056, trong cythonize_one

nâng cao CompileError [Không có, pyx_file]

Cython. Trình biên dịch. lỗi. Lỗi biên dịch. lập danh sách. pyx

có thể truyền hàm python không [e. g. nhà điều hành. eq] làm con trỏ hàm c bằng cython?

là một thư viện chức năng nước 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 để đả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 chiếu loại ctypes. 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. Vì vậy, bạn không nên nhầm lẫn nếu được in nếu bạn mong đợi - chúng thực sự là cùng một loại

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

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ệ khi lệnh gọi hàm không thành công

Đã thay đổi trong phiên bản 3. 3. Lỗi Windows được sử dụng để tăng , hiện là bí danh của.

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

>>> from ctypes import *
>>> print[windll.kernel32]  

>>> print[cdll.msvcrt]      

>>> libc = cdll.msvcrt      
>>>

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 gốc của Python 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 tay cầm 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 để truy xuất chức năng

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

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ự

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

chức năng gọi

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]

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

đượ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

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

Để 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, 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 , vì vậy bạn vẫn nên cẩn thận. Mô-đun này 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 gọi hàm với các loại tham số khác, chúng ta phải tìm hiểu thêm về các loại dữ liệu

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

định nghĩa một số kiểu dữ liệu tương thích C nguyên thủy

loại ctypes

loại C

loại trăn

_Bool

bo bo [1]

than

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

wchar_t

chuỗi 1 ký tự

than

int

không dấu ký tự

int

ngắn ngủi

int

không dấu ngắn

int

int

int

không dấu int

int

Dài

int

không dấu dài

int

__int64 hoặc dài dài

int

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

int

size_t

int

ssize_t hoặc

int

trôi nổi

trôi nổi

gấp đôi

trôi nổi

dài gấp đôi

trôi nổi

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

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

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

Gán một giá trị mới cho các thể hiện của các loại con trỏ , và thay đổi vị trí bộ nhớ mà chúng trỏ tới, 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 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 này 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.

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 chứ không phải , 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 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 hàm matrixdic

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ụ thể 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

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
062 cho tất cả các hàm biến đổi

Gọi các chức năng với các loại 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ố để 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. tìm kiếm 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
>>>
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 bạn không muốn lưu trữ dữ liệu của phiên bản trong biến đối tượng

>>> 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 biến sẽ 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 đã định nghĩa các lớp của riêng mình mà bạn chuyển đến các lệnh gọi hàm, 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ể hiện 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

loại trả lại

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

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
079 ở trên, bạn có thể đặ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 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 chức năng 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ì nó gọi lấy ra

Xin lưu ý rằng cơ chế kiểm tra lỗi mạnh mẽ hơn nhiều có sẵn 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

xuất hàm đượ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, mặc dù hàm này hoạt động hiệu quả hơn nhiều vì nó xây dựng một đối tượng con trỏ thực, vì vậy sẽ sử dụng 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ở và được định nghĩa trong mô-đun. 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 like hoặc bất kỳ loại 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

Các trường có thể được truy xuất từ ​​lớp, chúng rất hữu ích để 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

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

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 , , và cơ sở. 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 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 trên một loại

>>> 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ó một thuộc tính 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 không có OOR [trả về đối tượng ban đầu], nó sẽ 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

Việc gán một thể hiện 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, chức năng 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 chấp nhận bất kỳ loại 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

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 hội nghị [nhưng các con trỏ không phải ____1013 không hợp lệ khi hủy hội nghị sẽ làm hỏng Python]

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

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ó ____1225 trong danh sách ____1062 của 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

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

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 cần thiết 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

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

Đô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. cung cấp một chức năng có thể được sử dụng theo cùng một cách. 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 các con trỏ hoặc mảng
>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
225 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 chấp nhận các thể hiện của các loại khác

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

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

Hàm này 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. 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

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

Vì vậy, 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

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

Các 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

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

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

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

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 , 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

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

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

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

chức năng gọi lại

cho phép tạo các con trỏ hàm C 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 xuất xưởng 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 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

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

>>> 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. Cuộc gọi lại sau đó 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

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

Để 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

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

Kết quả

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

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

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

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

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

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

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

Ghi chú

Đảm bảo rằng bạn giữ các tham chiếu đến các đối tượng miễn là chúng được sử dụng từ mã C. 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 cho 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 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 chuỗi C

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

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à , một số nguyên được đặt thành 0, 1 hoặc 2, tùy thuộc vào cờ hoặc được cung cấp khi khởi động

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

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

Nếu trình thông dịch đã được bắt đầu với , 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 đã đượ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ỏ đượ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 các bản ghi, đượ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

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

Chúng ta đã xác định kiểu dữ liệu, vì vậy chúng ta có thể lấy con trỏ tới bảng

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

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

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

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

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

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ế?

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

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

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

Ghi chú

Các đối tượng được khởi tạo từ chỉ có thể có giá trị được đặt thành byte hoặc số nguyên

Tại sao nó 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

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

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

Chức năng này có thể được sử dụng để thay đổi kích thước bộ nhớ đệm của một đố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, a sẽ tăng nếu điều này được thử

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

Đ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?

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

Một cách khác để sử dụng các loại dữ liệu có kích thước thay đổi 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

tài liệu tham khảo 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 một 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ụ

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

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

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

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 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 gói thư viện dùng chung bằng , 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 một phiên bản 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 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ụ thể của cửa sổ. các giá trị 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, giá trị sẽ tự động tăng lên

Đã thay đổi trong phiên bản 3. 3. đã từng được nâng 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 hàm

>>> 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.

Python được phát hành trước khi gọi bất kỳ chức năng nào được xuất bởi các thư viện này 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, 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 thì 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 hệ thống theo cách an toàn. duy trì một bản sao cục bộ của biến hệ thống;

Hàm trả về giá trị của bản sao riêng của ctypes và hàm 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 Windows 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

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

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. _xử lý

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

PyDLL. _tên

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, 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 , , hoặc

>>> 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 phiên bản

ctypes. gió

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

ctypes. oledll

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

ctypes. pydll

Tạo phiên bản

Để 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 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 .

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

>>> 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 and assign a callable to the 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ộ, 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 trong bộ dữ liệu sẽ chuyển đổi một chuỗi được truyền dưới dạng đối số thành đối tượng byte bằng cách sử dụng quy tắc chuyển đổi ctypes

Mới mẻ. Hiện tại 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 nước 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 toán 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 chức năng

Các chức năng nước ngoài cũng có thể được tạo bằng cách khởi tạo các nguyên mẫu chức năng. 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 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 hệ thống được trao đổi với giá trị thực trước và sau lệnh 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 như

>>> 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 hàm 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

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

Đây là gói với

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

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

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

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

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

Đây là gói với

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

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ị, do đó, 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

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

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, 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

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

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

ctypes. địa chỉ của[obj]

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 một

>>> windll.kernel32.GetModuleHandleA[32]  
Traceback [most recent call last]:
  File "", line 1, in 
OSError: exception: access violation reading 0x00000020
>>>
998 với lập luận
>>> 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

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
300 tương ứng với mã C này

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

Đố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ư

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
301, 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

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 một

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
303 với các đối số
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
304,
>>> 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

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 một

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
307 với các đối số
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
304,
>>> 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

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
310 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ư

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
311, 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 tên của thư viện không thể được xác định, thì trả về

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

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

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
317, 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. Chức năng này gọi trực tiếp chức năng 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 hệ thống trong luồng gọi

Tăng một

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
320 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

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
321 hệ thống trong luồng gọi

Tăng một

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
322 mà 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

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

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

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
324 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

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
325, 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 hệ thống trong luồng gọi thành giá trị và trả về giá trị trước đó

Tăng một

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
327 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

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
321 hệ thống trong luồng gọi thành giá trị và trả về giá trị trước đó

Tăng một

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
330 với đối số
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
331

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

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

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 một

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
333 với các đối số
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
334,
>>> 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,

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
336 được gọi để xác định mã lỗi. Nếu descr không được chỉ định, đượ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 thể hiện của used đượ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 một

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
339 với các đối số
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
334,
>>> 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à ;

Các phương thức phổ biến của các kiểu dữ liệu ctypes, đây đều là các phương thức của lớp [chính xác là chúng là các phương thức của 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 thì a được nâng lên

Tăng một

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
345 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,
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
348

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 thì a được nâng lên

Tăng một

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
345 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,
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
348

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

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
354 với đối số
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
334

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

_các đố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. là một lớp con của , vì vậy 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. không thực hiện trả về đối tượng ban đầu, luôn 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 nước 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 , bạn sẽ luôn nhận được một đối tượng byte Python, không phải là một thể hiện

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 nước 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 , 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

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
369. 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ó

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
370, đó là bí danh của.

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ó

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
372, đó là bí danh của.

lớp ctypes. c_int8

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

lớp ctypes. c_int16

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

lớp ctypes. c_int32

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

lớp ctypes. c_int64

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

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

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

lớp ctypes. c_ssize_t

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

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

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ó

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
372, nó là bí danh cho.

lớp ctypes. c_uint8

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

lớp ctypes. c_uint16

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

lớp ctypes. c_uint32

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

lớp ctypes. c_uint64

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

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

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
386 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 * . Gọi cái 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 * .

Mô-đun

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
390 cung cấp khá nhiều loại dữ liệu cụ thể khác của Windows, ví dụ như
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
391,
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
392 hoặc
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
393. Một số cấu trúc hữu ích như
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
394 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

Các 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ấu trúc cụ thể và các kiểu kết hợp phải được tạo bằng cách phân lớp một trong các kiểu này và ít nhất là xác định một biến lớp. sẽ tạo s 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à những

_lĩnh vực_

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ư , 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 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 tham chiếu trực tiếp hoặc gián tiếp đến chính chúng

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

Tuy nhiên, biến lớp phải được định nghĩa trước khi kiểu được sử dụng lần đầu tiên [một thể hiện được tạo, được gọi trên nó, v.v.]. Các phép gán sau này cho biến lớp sẽ tăng AttributeError

Có thể định nghĩa các lớp con con của 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 các trường được định nghĩa trong lớp con con nếu có

_đóng gói_

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ụ. phải được xác định khi được chỉ định, nếu không nó sẽ không có hiệu lực

_vô danh_

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]. phải được xác định trước khi được chỉ định, 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. sẽ tạo các mô tả trong kiểu cấu trúc cho phép truy cập trực tiếp vào các trường lồng nhau mà không cần tạo cấu trúc hoặc trường kết hợp

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

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

Cấu trúc

>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
409 mô tả kiểu dữ liệu COM, trường
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
410 chỉ định một trong các trường liên kết hợp lệ. Vì trường
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
411 đượ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.
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
412 và
>>> c_int[]
c_long[0]
>>> c_wchar_p["Hello, World"]
c_wchar_p[140018365411392]
>>> c_ushort[-3]
c_ushort[65533]
>>>
413 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

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

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 riêng, 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 thứ tự như chúng xuất hiện trong. Các đối số từ khóa trong hàm tạo được hiểu là các thuộc tính được gán, vì vậy chúng sẽ khởi tạo 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

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 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 và các biến lớp. 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;

_chiều dài_

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 một. Sẽ được trả lại bởi

_loại_

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 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 sẽ tăng. 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]

_loại_

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

Python có con trỏ hàm không?

Tuy nhiên, vì chúng ta có thể đặt các hàm trong Python thành một biến và tham chiếu nó, nên bạn sẽ thấy nó thường được gọi là con trỏ hàm .

Hàm có thể là con trỏ không?

Giống như biến, lệnh của hàm cũng được lưu trong bộ nhớ và có địa chỉ. Con trỏ trỏ tới địa chỉ của hàm được gọi là con trỏ hàm . Một con trỏ hàm trong C có thể được sử dụng để tạo các lệnh gọi hàm tới hàm mà chúng trỏ tới giống như một hàm thông thường.

4 loại hàm trong Python là gì?

Sau đây là các loại Hàm Python khác nhau. .
Hàm tích hợp Python
Hàm đệ quy Python
Hàm Lambda trong Python
Các hàm do người dùng định nghĩa trong Python

Chủ Đề