Tại sao con trỏ không được hỗ trợ trong python?
>>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 là thư viện hàm ngoại cho Python. Nó cung cấp các kiểu dữ liệu tương thích với C và cho phép gọi các hàm trong DLL hoặc thư viện dùng chung. Nó có thể được sử dụng để bọc các thư viện này bằng Python thuần túy Show
hướng dẫn ctypes¶Ghi chú. Các mẫu mã trong hướng dẫn này sử dụng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "2 để đảm bảo rằng chúng thực sự hoạt động. Vì một số mẫu mã hoạt động khác nhau trong Linux, Windows hoặc macOS nên chúng chứa các lệnh doctest trong nhận xét Ghi chú. Một số mẫu mã tham khảo loại ctypes >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "3. Trên các nền tảng mà >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "4 nó là bí danh của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "5. Vì vậy, bạn không nên nhầm lẫn nếu >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "5 được in nếu bạn mong đợi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "3 - chúng thực sự là cùng một loại Đang tải các thư viện liên kết động¶>>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 xuất cdll và trên các đối tượng Windll và oledll của Windows để tải các thư viện liên kết động Bạn tải các thư viện bằng cách truy cập chúng dưới dạng thuộc tính của các đối tượng này. cdll tải các thư viện xuất các hàm bằng cách sử dụng quy ước gọi điện >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "9 tiêu chuẩn, trong khi các thư viện Windll gọi các hàm bằng cách sử dụng quy ước gọi điện >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>0. oledll cũng sử dụng quy ước gọi >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>0 và giả định rằng các hàm trả về mã lỗi Windows >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>2. Mã lỗi được sử dụng để tự động đưa ra một ngoại lệ >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>3 khi lệnh gọi hàm không thành công Đã thay đổi trong phiên bản 3. 3. Các lỗi Windows từng gây ra >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>4, hiện là bí danh của >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>3. Dưới đây là một số ví dụ cho Windows. Lưu ý rằng >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>6 là thư viện C tiêu chuẩn của MS chứa hầu hết các hàm C tiêu chuẩn và sử dụng quy ước gọi cdecl >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "6 Windows tự động nối thêm hậu tố tệp >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>7 thông thường Ghi chú Truy cập thư viện C tiêu chuẩn thông qua >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>8 sẽ sử dụng phiên bản lỗi thời của thư viện có thể không tương thích với phiên bản đang được Python sử dụng. Nếu có thể, hãy sử dụng chức năng Python gốc hoặc nhập và sử dụng mô-đun >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>6 Trên Linux, cần chỉ định tên tệp bao gồm cả phần mở rộng để tải thư viện, vì vậy không thể sử dụng quyền truy cập thuộc tính để tải thư viện. Nên sử dụng phương thức >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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 "2 Lưu ý rằng các dll hệ thống win32 như >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "001 và >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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 "004 được thêm vào tên. Hàm win32 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "005, trả về một điều khiển mô-đun cho một tên mô-đun nhất định, có nguyên mẫu C sau đây và một macro được sử dụng để hiển thị một trong số chúng là >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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 "007 hoặc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "009. Trong trường hợp này, bạn phải sử dụng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "010 để truy xuất chức năng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "4 Trên Windows, một số hàm xuất dll không theo tên mà theo thứ tự. Các chức năng này có thể được truy cập bằng cách lập chỉ mục đối tượng dll với số thứ tự >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "5 Gọi hàm¶Bạn có thể gọi các hàm này giống như bất kỳ hàm nào khác có thể gọi được của Python. Ví dụ này sử dụng hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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 "013 ( >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "014 nên được sử dụng làm con trỏ >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "013) >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "1 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "016 được nâng lên khi bạn gọi một hàm >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>0 với quy ước gọi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "9 hoặc ngược lại >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "5 Để tìm ra quy ước gọi chính xác, bạn phải xem tệp tiêu đề C hoặc tài liệu về chức năng bạn muốn gọi Trên Windows, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 sử dụng xử lý ngoại lệ có cấu trúc win32 để ngăn sự cố do lỗi bảo vệ chung khi các hàm được gọi với giá trị đối số không hợp lệ >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File " Tuy nhiên, có đủ cách để đánh sập Python với >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0, vì vậy dù sao thì bạn cũng nên cẩn thận. Mô-đun >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "021 có thể hữu ích trong việc gỡ lỗi sự cố (e. g. từ các lỗi phân đoạn được tạo ra bởi các lệnh gọi thư viện C sai) >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "014 được truyền dưới dạng con trỏ C >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "013, các đối tượng byte và chuỗi được truyền dưới dạng con trỏ tới khối bộ nhớ chứa dữ liệu của chúng ( char* or wchar_t*). Python integers are passed as the platforms default C int mặc định của nền tảng, giá trị của chúng được ẩn để phù hợp với loại C. Trước khi chuyển sang gọi hàm với các kiểu tham số khác, chúng ta phải tìm hiểu thêm về kiểu dữ liệu >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 Các kiểu dữ liệu cơ bản¶>>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 định nghĩa một số kiểu dữ liệu tương thích với C nguyên thủy loại ctypes loại C loại trăn >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "027 _Bool bo bo (1) >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "028 than đối tượng byte 1 ký tự >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "029 wchar_t chuỗi 1 ký tự >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "030 than int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "031 không dấu ký tự int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "032 ngắn int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "033 không dấu ngắn int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "3 int int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "035 không dấu int int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "5 Dài int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "037 không dấu dài int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "038 __int64 hoặc dài dài int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "039 không dấu __int64 hoặc không dấu dài long int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "040 size_t int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "041 ssize_t hoặc Py_ssize_t int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "042 trôi nổi trôi nổi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "043 kép trôi nổi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "044 dài gấp đôi trôi nổi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "045 char* (NUL chấm dứt) đối tượng byte hoặc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "014 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "047 wchar_t* (NUL chấm dứt) chuỗi hoặc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "014 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "049 khoảng trống* int hoặc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "014
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 "00 Việc gán một giá trị mới cho các thể hiện của các loại con trỏ >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "045, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "047 và >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "049 sẽ thay đổi vị trí bộ nhớ mà chúng trỏ tới, chứ không phải nội dung của khối bộ nhớ (tất nhiên là không, vì các đối tượng byte trong Python là bất biến) >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "01 Tuy nhiên, bạn nên cẩn thận, không chuyển chúng đến các hàm mong đợi con trỏ tới bộ nhớ có thể thay đổi. Nếu bạn cần các khối bộ nhớ có thể thay đổi, ctypes có chức năng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "054 để tạo các khối này theo nhiều cách khác nhau. Nội dung khối bộ nhớ hiện tại có thể được truy cập (hoặc thay đổi) bằng thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "055; >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "02 Hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "054 thay thế hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "058 cũ (vẫn có sẵn dưới dạng bí danh). Để tạo khối bộ nhớ có thể thay đổi chứa các ký tự unicode thuộc loại C wchar_t , hãy sử dụng hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "059. Các chức năng gọi, tiếp tục¶Lưu ý rằng printf in ra kênh đầu ra tiêu chuẩn thực, không phải >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "060, vì vậy những ví dụ này sẽ chỉ hoạt động tại dấu nhắc bảng điều khiển, không phải từ bên trong IDLE hoặc PythonWin >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "03 Như đã đề cập trước đây, tất cả các loại Python ngoại trừ các đối tượng số nguyên, chuỗi và byte phải được gói trong loại >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 tương ứng của chúng, để chúng có thể được chuyển đổi thành loại dữ liệu C được yêu cầu >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "04 Gọi các hàm biến thiên¶Trên nhiều nền tảng, việc gọi các hàm biến đổi thông qua ctypes hoàn toàn giống như gọi các hàm với một số tham số cố định. Trên một số nền tảng và đặc biệt là ARM64 dành cho Nền tảng Apple, quy ước gọi hàm biến đổi khác với quy ước gọi hàm thông thường Trên các nền tảng đó, bắt buộc phải chỉ định thuộc tính argtypes cho các đối số hàm thông thường, không biến đổi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "05 Bởi vì việc chỉ định thuộc tính không hạn chế tính di động, nên luôn chỉ định ________ 2062 cho tất cả các hàm biến đổi Gọi hàm với kiểu dữ liệu tùy chỉnh của riêng bạn¶Bạn cũng có thể tùy chỉnh chuyển đổi đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 để cho phép sử dụng các thể hiện của các lớp của riêng bạn làm đối số hàm. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 tìm thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "06 Nếu không muốn lưu trữ dữ liệu của phiên bản trong biến phiên bản >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "065, bạn có thể xác định một >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "067 để cung cấp thuộc tính theo yêu cầu Chỉ định các loại đối số bắt buộc (nguyên mẫu hàm)¶Có thể chỉ định các loại đối số bắt buộc của các hàm được xuất từ DLL bằng cách đặt thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "062 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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 "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 "08 Nếu bạn đã xác định các lớp của riêng mình mà bạn chuyển đến các lời gọi hàm, thì bạn phải triển khai một phương thức lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "071 để chúng có thể sử dụng chúng trong chuỗi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "062. Phương thức lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "065 của nó hoặc bất kỳ thứ gì bạn muốn chuyển dưới dạng . Một lần nữa, kết quả phải là một số nguyên, chuỗi, byte, một thực thể >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 hoặc một đối tượng có thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "065 Các kiểu trả về¶Theo mặc định, hàm được giả sử trả về loại C int . Các kiểu trả về khác có thể được chỉ định bằng cách đặt thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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 "09 Nếu bạn muốn tránh các cuộc gọi ________ 2079 ở trên, bạn có thể đặt thuộc tính ________ 2062 và đối số thứ hai sẽ được chuyển đổi từ đối tượng byte Python ký tự đơn thành ký tự C >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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 "21 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "082 là một hàm sẽ gọi Windows >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "082 lấy tham số mã lỗi tùy chọn, nếu không có ai dùng thì gọi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "085 để lấy Xin lưu ý rằng có một cơ chế kiểm tra lỗi mạnh mẽ hơn nhiều thông qua thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "086; Truyền con trỏ (hoặc. truyền tham số theo tham chiếu)¶Đôi khi, một hàm C api mong đợi một con trỏ tới một loại dữ liệu làm tham số, có thể ghi vào vị trí tương ứng hoặc nếu dữ liệu quá lớn để được truyền theo giá trị. Điều này còn được gọi là truyền tham số theo tham chiếu >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 xuất hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "088 được sử dụng để truyền tham số theo tham chiếu. Hiệu ứng tương tự có thể đạt được với hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "089, mặc dù >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "089 làm được nhiều việc hơn vì nó xây dựng một đối tượng con trỏ thực, vì vậy sử dụng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "088 sẽ nhanh hơn nếu bạn không cần đối tượng con trỏ trong chính Python >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "22 Cấu trúc và hiệp hội¶Các cấu trúc và liên kết phải xuất phát từ các lớp cơ sở >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "092 và >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "093 được định nghĩa trong mô-đun >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0. Mỗi lớp con phải xác định một thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095 phải là danh sách gồm 2 bộ, chứa tên trường và loại trường Loại trường phải là loại >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 như >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "3 hoặc bất kỳ loại >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 dẫn xuất nào khác. cấu trúc, hợp, mảng, con trỏ Đây là một ví dụ đơn giản về cấu trúc POINT, chứa hai số nguyên có tên x và y, đồng thời chỉ ra cách khởi tạo cấu trúc trong hàm tạo >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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 "25 Trường mô tả có thể được truy xuất từ lớp, chúng hữu ích cho việc gỡ lỗi vì chúng có thể cung cấp thông tin hữu ích. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "26 Cảnh báo >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 không hỗ trợ chuyển các liên kết hoặc cấu trúc có trường bit cho các hàm theo giá trị. Mặc dù điều này có thể hoạt động trên 32-bit x86, nhưng nó không được thư viện đảm bảo hoạt động trong trường hợp chung. Các liên kết và cấu trúc với các trường bit phải luôn được chuyển đến các hàm bằng con trỏ Căn chỉnh cấu trúc/liên kết và thứ tự byte¶Theo mặc định, các trường Cấu trúc và Liên kết được căn chỉnh giống như cách mà trình biên dịch C thực hiện. Có thể ghi đè hành vi này bằng cách chỉ định thuộc tính lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "202 cũng làm trong MSVC >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 sử dụng thứ tự byte gốc cho Cấu trúc và Liên kết. Để xây dựng các cấu trúc với thứ tự byte không có nguồn gốc, bạn có thể sử dụng một trong các lớp cơ sở >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "204, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "205, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "206 và >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "207. Các lớp này không thể chứa các trường con trỏ Các trường bit trong cấu trúc và liên kết¶Có thể tạo các cấu trúc và liên kết chứa các trường bit. Các trường bit chỉ khả dụng cho các trường số nguyên, độ rộng bit được chỉ định là mục thứ ba trong bộ dữ liệu >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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 "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 "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 "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 "91 Con trỏ¶Các trường hợp con trỏ được tạo bằng cách gọi hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "089 trên loại >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "92 Các thể hiện con trỏ có thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "212 trả về đối tượng mà con trỏ trỏ tới, đối tượng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "213 ở trên >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "93 Lưu ý rằng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 không có OOR (trả về đối tượng ban đầu), nó xây dựng một đối tượng mới, tương đương mỗi khi bạn truy xuất một thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "94 Gán một phiên bản >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "3 khác cho thuộc tính nội dung của con trỏ sẽ khiến con trỏ trỏ đến vị trí bộ nhớ nơi lưu trữ nội dung này >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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 "97 Cũng có thể sử dụng các chỉ số khác 0, nhưng bạn phải biết mình đang làm gì, giống như trong C. Bạn có thể truy cập hoặc thay đổi vị trí bộ nhớ tùy ý. Nói chung, bạn chỉ sử dụng tính năng này nếu bạn nhận được một con trỏ từ hàm C và bạn biết rằng con trỏ thực sự trỏ đến một mảng thay vì một mục đơn lẻ Đằng sau hậu trường, hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "089 không chỉ đơn giản là tạo các thể hiện con trỏ, trước tiên nó phải tạo các loại con trỏ. Điều này được thực hiện với hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "217, chấp nhận bất kỳ loại >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 nào và trả về một loại mới >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "013. Con trỏ >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "013 có giá trị boolean >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "221 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "99 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "013 khi các con trỏ hủy tham chiếu (nhưng các con trỏ không phải ____2013 không hợp lệ khi hủy tham chiếu sẽ làm hỏng Python) >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "40 Loại chuyển đổi¶Thông thường, ctypes kiểm tra loại nghiêm ngặt. Điều này có nghĩa là, nếu bạn có >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "225 trong danh sách >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "062 của một hàm hoặc là loại của trường thành viên trong định nghĩa cấu trúc, thì chỉ các phiên bản có cùng loại mới được chấp nhận. Có một số ngoại lệ đối với quy tắc này, trong đó ctypes chấp nhận các đối tượng khác. Ví dụ: bạn có thể chuyển các thể hiện mảng tương thích thay vì các kiểu con trỏ. Vì vậy, đối với >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "225, ctypes chấp nhận một mảng c_int >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "41 Ngoài ra, nếu một đối số của hàm được khai báo rõ ràng là một loại con trỏ (chẳng hạn như >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "225) trong >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "3) có thể được truyền cho hàm. ctypes sẽ tự động áp dụng chuyển đổi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "088 bắt buộc trong trường hợp này Để đặt trường loại CON TRỎ thành >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "013, bạn có thể gán >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "014 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "42 Đôi khi bạn gặp trường hợp các loại không tương thích. Trong C, bạn có thể ép kiểu này thành kiểu khác. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 cung cấp hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "235 có thể được sử dụng theo cách tương tự. Cấu trúc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "236 được xác định ở trên chấp nhận con trỏ >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "225 hoặc mảng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "3 cho trường >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "239 của nó, nhưng không phải trường hợp của các loại khác >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "43 Đối với những trường hợp này, chức năng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "235 rất hữu ích Hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "235 có thể được sử dụng để truyền một cá thể ctypes thành một con trỏ tới một kiểu dữ liệu ctypes khác. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "235 nhận hai tham số, một đối tượng ctypes hoặc có thể được chuyển đổi thành một loại con trỏ nào đó và một loại con trỏ ctypes. Nó trả về một thể hiện của đối số thứ hai, tham chiếu đến cùng một khối bộ nhớ như đối số đầu tiên >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "44 Vì vậy, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "235 có thể được sử dụng để gán cho trường >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "239 của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "236 cấu trúc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "45 Loại không đầy đủ¶Các loại không đầy đủ là các cấu trúc, liên kết hoặc mảng có thành viên chưa được chỉ định. Trong C, chúng được chỉ định bởi các khai báo chuyển tiếp, được xác định sau >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "46 Bản dịch đơn giản sang mã ctypes sẽ là thế này, nhưng nó không hoạt động >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "47 bởi vì >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "246 mới không có sẵn trong chính câu lệnh lớp. Trong >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0, chúng ta có thể định nghĩa lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "248 và đặt thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095 sau đó, sau câu lệnh lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "48 Hãy thử nó. Chúng tôi tạo hai phiên bản của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "248 và để chúng trỏ đến nhau và cuối cùng thực hiện theo chuỗi con trỏ một vài lần >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "49 Hàm gọi lại¶>>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 cho phép tạo các con trỏ hàm có thể gọi C từ các hàm có thể gọi được của Python. Đôi khi chúng được gọi là các hàm gọi lại Trước tiên, bạn phải tạo một lớp cho chức năng gọi lại. Lớp biết quy ước gọi, kiểu trả về, số lượng và kiểu đối số mà hàm này sẽ nhận Hàm nhà máy >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "252 tạo các loại cho hàm gọi lại bằng cách sử dụng quy ước gọi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "9. Trên Windows, hàm xuất xưởng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "254 tạo các loại cho hàm gọi lại bằng cách sử dụng quy ước gọi >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>0 Cả hai hàm xuất xưởng này đều được gọi với loại kết quả làm đối số đầu tiên và các hàm gọi lại mong đợi loại đối số làm đối số còn lại Tôi sẽ trình bày một ví dụ ở đây sử dụng hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "256 sẽ được sử dụng để sắp xếp một mảng các số nguyên >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "50 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "256 phải được gọi với một con trỏ tới dữ liệu cần sắp xếp, số mục trong mảng dữ liệu, kích thước của một mục và một con trỏ tới hàm so sánh, gọi lại. Sau đó, cuộc gọi lại sẽ được gọi với hai con trỏ tới các mục và nó phải trả về một số nguyên âm nếu mục đầu tiên nhỏ hơn mục thứ hai, số 0 nếu chúng bằng nhau và một số nguyên dương nếu không Vì vậy, hàm gọi lại của chúng tôi nhận con trỏ tới số nguyên và phải trả về số nguyên. Đầu tiên chúng ta tạo >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "259 cho chức năng gọi lại >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "51 Để bắt đầu, đây là một lệnh gọi lại đơn giản hiển thị các giá trị mà nó được truyền >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "52 Kết quả >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "53 Bây giờ chúng tôi thực sự có thể so sánh hai mục và trả về một kết quả hữu ích >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "54 Vì chúng ta có thể dễ dàng kiểm tra, mảng của chúng ta hiện đã được sắp xếp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "55 Các nhà máy chức năng có thể được sử dụng làm nhà máy trang trí, vì vậy chúng tôi cũng có thể viết >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "56 Ghi chú Đảm bảo rằng bạn giữ các tham chiếu đến các đối tượng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "252 miễn là chúng được sử dụng từ mã C. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 thì không, và nếu bạn không, chúng có thể bị thu gom rác, làm hỏng chương trình của bạn khi gọi lại Ngoài ra, hãy lưu ý rằng nếu chức năng gọi lại được gọi trong một luồng được tạo bên ngoài sự kiểm soát của Python (e. g. bởi mã nước ngoài gọi hàm gọi lại), ctypes tạo một luồng Python giả mới trên mỗi lệnh gọi. Hành vi này đúng với hầu hết các mục đích, nhưng điều đó có nghĩa là các giá trị được lưu trữ bằng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "262 sẽ không tồn tại qua các lệnh gọi lại khác nhau, ngay cả khi các lệnh gọi đó được thực hiện từ cùng một luồng C Truy cập các giá trị được xuất từ dlls¶Một số thư viện dùng chung không chỉ xuất các hàm mà còn xuất các biến. Một ví dụ trong chính thư viện Python là >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "263, một số nguyên được đặt thành 0, 1 hoặc 2, tùy thuộc vào cờ >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "264 hoặc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "265 được cung cấp khi khởi động >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 có thể truy cập các giá trị như thế này với các phương thức lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "267 thuộc loại. pythonapi là một biểu tượng được xác định trước cấp quyền truy cập vào Python C api >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "57 Nếu trình thông dịch đã được bắt đầu với >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "264, thì mẫu sẽ được in >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "269 hoặc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "270 nếu >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "265 đã được chỉ định Một ví dụ mở rộng cũng minh họa việc sử dụng con trỏ truy cập con trỏ >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "272 được xuất bởi Python Trích dẫn các tài liệu cho giá trị đó
Vì vậy, thao tác con trỏ này thậm chí có thể hữu ích. Để hạn chế kích thước ví dụ, chúng tôi chỉ hiển thị cách đọc bảng này với >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "58 Chúng tôi đã xác định kiểu dữ liệu >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "273, vì vậy chúng tôi có thể lấy con trỏ tới bảng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "59 Vì >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "277 là một >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "278 của mảng bản ghi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "013 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "10 Thực tế là Python tiêu chuẩn có một mô-đun bị đóng băng và một gói bị đóng băng (được biểu thị bởi thành viên phủ định >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "282 chẳng hạn ngạc nhiên¶Có một số khía cạnh trong >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 mà bạn có thể mong đợi điều gì đó khác với những gì thực sự xảy ra Xem xét ví dụ sau >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "11 hừm. Chúng tôi chắc chắn mong đợi tuyên bố cuối cùng để in >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "284. Chuyện gì đã xảy ra thế? >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "12 Lưu ý rằng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "286 và >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "288 ở trên. Vì vậy, việc thực thi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "289 sao chép nội dung bộ đệm của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "286 vào bộ đệm của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "287. Vì vậy, nhiệm vụ cuối cùng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "293, không có tác dụng như mong đợi Hãy nhớ rằng việc truy xuất các đối tượng phụ từ Cấu trúc, Liên kết và Mảng không sao chép đối tượng phụ, thay vào đó, nó truy xuất một đối tượng trình bao đang truy cập vào bộ đệm bên dưới của đối tượng gốc Một ví dụ khác có thể hoạt động khác với những gì người ta mong đợi là đây >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "13 Ghi chú Các đối tượng được khởi tạo từ >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "045 chỉ có thể đặt giá trị của chúng thành byte hoặc số nguyên Tại sao nó lại in >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "212 of the object is stored. Accessing the contents again constructs a new Python object each time! Kiểu dữ liệu có kích thước thay đổi¶>>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 cung cấp một số hỗ trợ cho các mảng và cấu trúc có kích thước thay đổi Hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "298 có thể được sử dụng để thay đổi kích thước bộ nhớ đệm của đối tượng ctypes hiện có. Hàm lấy đối tượng làm đối số đầu tiên và kích thước được yêu cầu tính bằng byte làm đối số thứ hai. Không thể tạo khối bộ nhớ nhỏ hơn khối bộ nhớ tự nhiên được chỉ định bởi loại đối tượng, một >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "016 sẽ xuất hiện nếu điều này được thử >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "14 Điều này là tốt và tốt, nhưng làm cách nào để truy cập các phần tử bổ sung có trong mảng này? >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "15 Một cách khác để sử dụng các loại dữ liệu có kích thước thay đổi với >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 là sử dụng tính chất động của Python và (xác định lại) loại dữ liệu sau khi đã biết kích thước yêu cầu, tùy từng trường hợp tham chiếu ctypes¶Tìm thư viện dùng chung¶Khi lập trình bằng ngôn ngữ được biên dịch, các thư viện dùng chung được truy cập khi biên dịch/liên kết chương trình và khi chương trình được chạy Mục đích của hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "902 cung cấp chức năng có thể giúp xác định thư viện sẽ tảictypes. 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 "903, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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 "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 "901 cố chạy các chương trình bên ngoài ( >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "908, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "909, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "910 và >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "912 được sử dụng khi tìm kiếm thư viện, nếu không thể tìm thấy thư viện bằng bất kỳ cách nào khác. Dưới đây là một số ví dụ >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "16 Trên macOS, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "901 thử một số sơ đồ đặt tên và đường dẫn được xác định trước để định vị thư viện và trả về tên đường dẫn đầy đủ nếu thành công >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "17 Trên Windows, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "901 tìm kiếm dọc theo đường dẫn tìm kiếm của hệ thống và trả về tên đường dẫn đầy đủ, nhưng vì không có sơ đồ đặt tên được xác định trước nên lệnh gọi như >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "915 sẽ không thành công và trả về >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "014 Nếu bọc thư viện dùng chung bằng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0, có thể tốt hơn là xác định tên thư viện dùng chung tại thời điểm phát triển và mã hóa cứng tên đó vào mô-đun trình bao bọc thay vì sử dụng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "901 để định vị thư viện khi chạy Đang tải thư viện dùng chung¶Có một số cách để tải các thư viện dùng chung vào quy trình Python. Một cách là khởi tạo một trong các lớp sau lớp ctypes. CDLL(tên , chế độ=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None)¶Các thực thể của lớp này đại diện cho các thư viện dùng chung đã tải. Các hàm trong các thư viện này sử dụng quy ước gọi C tiêu chuẩn và được giả định là trả về int . Trên Windows, việc tạo phiên bản >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "919 có thể không thành công ngay cả khi tên DLL tồn tại. Khi không tìm thấy tệp DLL phụ thuộc của tệp DLL đã tải, lỗi >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>3 sẽ xuất hiện với thông báo “[WinError 126] Không thể tìm thấy mô-đun được chỉ định”. Thông báo lỗi này không chứa tên của tệp DLL bị thiếu vì API Windows không trả lại thông tin này khiến lỗi này khó chẩn đoán. Để khắc phục lỗi này và xác định không tìm thấy DLL nào, bạn cần tìm danh sách các DLL phụ thuộc và xác định xem không tìm thấy DLL nào bằng cách sử dụng các công cụ theo dõi và gỡ lỗi của Windows Xem thêm Microsoft DUMPBIN tool – Một công cụ để tìm DLL phụ thuộc lớp ctypes. OleDLL(tên , chế độ=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None)¶chỉ cửa sổ. Các phiên bản của lớp này đại diện cho các thư viện được chia sẻ đã tải, các hàm trong các thư viện này sử dụng quy ước gọi >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>0 và được cho là trả về mã >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>2 cụ thể của cửa sổ. Giá trị >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>2 chứa thông tin xác định lệnh gọi hàm thất bại hay thành công, cùng với mã lỗi bổ sung. Nếu giá trị trả về báo hiệu lỗi, một >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>3 sẽ tự động được nâng lên Đã thay đổi trong phiên bản 3. 3. ______94 đã từng lớn lên. lớp ctypes. WinDLL(tên , chế độ=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None)¶Chỉ dành cho Windows. Các phiên bản của lớp này đại diện cho các thư viện dùng chung đã tải, các hàm trong các thư viện này sử dụng quy ước gọi >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>0 và được giả định trả về int theo mặc định. Khóa trình thông dịch toàn cục của Python được giải phóng trước khi gọi bất kỳ chức năng nào do các thư viện này xuất và được yêu cầu lại sau đó. lớp ctypes. PyDLL(tên , chế độ=DEFAULT_MODE, handle=None)¶Các phiên bản của lớp này hoạt động giống như các phiên bản >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "919, ngoại trừ GIL Python không được giải phóng trong khi gọi hàm và sau khi thực thi chức năng, cờ lỗi Python được kiểm tra. Nếu cờ lỗi được đặt, một ngoại lệ Python sẽ xuất hiện Do đó, điều này chỉ hữu ích khi gọi trực tiếp các hàm api của Python C Tất cả các lớp này có thể được khởi tạo bằng cách gọi chúng với ít nhất một đối số, tên đường dẫn của thư viện dùng chung. Nếu bạn có sẵn một thẻ điều khiển cho một thư viện dùng chung đã được tải, thì nó có thể được chuyển dưới dạng tham số có tên là >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "928, nếu không, hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "929 hoặc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "930 của các nền tảng cơ bản được sử dụng để tải thư viện vào quy trình và để xử lý nó Tham số chế độ có thể được sử dụng để chỉ định cách tải thư viện. Để biết chi tiết, tham khảo trang dlopen(3). Trên Windows, chế độ bị bỏ qua. Trên các hệ thống posix, RTLD_NOW luôn được thêm vào và không thể định cấu hình Tham số use_errno, khi được đặt thành true, sẽ bật cơ chế ctypes cho phép truy cập số lỗi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "931 của hệ thống theo cách an toàn. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 duy trì một bản sao luồng cục bộ của biến >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "931 của hệ thống; Hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "936 trả về giá trị của bản sao riêng của ctypes và hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "937 thay đổi bản sao riêng của ctypes thành một giá trị mới và trả về giá trị cũ Tham số use_last_error, khi được đặt thành true, sẽ kích hoạt cơ chế tương tự cho mã lỗi Windows được quản lý bởi các hàm API của Windows >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "085 và >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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_GLOBALGắ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_LOCALGắ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_MODEChế độ mặc định được sử dụng để tải các thư viện dùng chung. Trên OSX10. 3, đây là RTLD_GLOBAL, nếu không thì nó giống như RTLD_LOCAL Thể hiện của các lớp này không có phương thức công khai. Các chức năng được xuất bởi thư viện dùng chung có thể được truy cập dưới dạng thuộc tính hoặc theo chỉ mục. Xin lưu ý rằng việc truy cập hàm thông qua một thuộc tính sẽ lưu trữ kết quả và do đó, việc truy cập nó nhiều lần sẽ trả về cùng một đối tượng mỗi lần. Mặt khác, truy cập nó thông qua một chỉ mục sẽ trả về một đối tượng mới mỗi lần >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "18 Các thuộc tính công khai sau đây khả dụng, tên của chúng bắt đầu bằng dấu gạch dưới để không xung đột với tên hàm đã xuất PyDLL. _handle ¶Tay cầm hệ thống dùng để truy cập thư viện PyDLL. _name ¶Tên của thư viện được truyền trong hàm tạo Các thư viện dùng chung cũng có thể được tải bằng cách sử dụng một trong các đối tượng đúc sẵn, là các thể hiện của lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "943, bằng cách gọi phương thức >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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ảilớp ctypes. Trình tải thư viện(dlltype) ¶ Lớp tải thư viện dùng chung. dlltype phải là một trong các loại >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "919, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "946, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "947 hoặc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "948 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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ầnLoadLibrary(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. cdllTạo các phiên bản >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "919ctypes. gió chỉ cửa sổ. Tạo các phiên bản >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "947ctypes. oledll chỉ cửa sổ. Tạo các phiên bản >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "948ctypes. pydll Tạo các phiên bản >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "946 Để truy cập trực tiếp vào api C Python, có sẵn đối tượng thư viện chia sẻ Python sẵn sàng sử dụng ctypes. pythonapiMột phiên bản của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "946 hiển thị các hàm API Python C dưới dạng thuộc tính. Lưu ý rằng tất cả các hàm này được giả định là trả về C int , điều này tất nhiên không phải lúc nào cũng đúng, vì vậy bạn phải gán đúng thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "077 để sử dụng . Việc tải thư viện thông qua bất kỳ đối tượng nào trong số này sẽ tạo ra một sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "956 với đối số chuỗi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "958 với các đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "959 (đối tượng thư viện) và >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "961 với các đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "928 (xử lý thư viện thô) và >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "014 cho void , một hàm không trả về bất cứ thứ gì. Có thể gán một đối tượng Python có thể gọi được không phải là loại ctypes, trong trường hợp này, hàm được giả sử trả về một C int, and the callable will be called with this integer, allowing further processing or error checking. Using this is deprecated, for more flexible post processing or error checking use a ctypes data type as >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "077 and assign a callable to the >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "086 attribute.kiểu đối số ¶ Chỉ định một bộ các loại ctypes để chỉ định các loại đối số mà hàm chấp nhận. Các hàm sử dụng quy ước gọi >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>0 chỉ có thể được gọi với cùng số lượng đối số bằng độ dài của bộ dữ liệu này; Khi một hàm ngoại được gọi, mỗi đối số thực được truyền cho phương thức lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "071 của các mục trong bộ >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "062, phương thức này cho phép điều chỉnh đối số thực cho một đối tượng mà hàm ngoại chấp nhận. Ví dụ: một mục >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "045 trong bộ >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "062 sẽ chuyển đổi một chuỗi được truyền dưới dạng đối số thành một đối tượng byte bằng cách sử dụng quy tắc chuyển đổi ctypes Mới. Giờ đây, có thể đặt các mục trong các kiểu đối số không phải là kiểu ctypes, nhưng mỗi mục phải có một phương thức >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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ăngkiểm tra lỗi ¶ Gán một hàm Python hoặc một hàm khác có thể gọi được cho thuộc tính này. Có thể gọi được sẽ được gọi với ba đối số trở lên có thể gọi(kết quả , chức năng, arguments)kết quả là những gì hàm ngoại trả về, như được chỉ định bởi thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "974 với đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "975 sẽ được nêu ra, cho phép móc kiểm tra thay thế ngoại lệ bằng chính nó Một số cách gọi hàm ngoại lai có thể gây ra sự kiện kiểm toán >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "976 với các đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "977 và >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "978 Nguyên mẫu hàm¶Các hàm lạ cũng có thể được tạo bằng cách khởi tạo nguyên mẫu hàm. Nguyên mẫu hàm tương tự như nguyên mẫu hàm trong C; . Các hàm xuất xưởng phải được gọi với loại kết quả mong muốn và các loại đối số của hàm, đồng thời có thể được sử dụng làm nhà máy trang trí và như vậy, được áp dụng cho các hàm thông qua cú pháp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "979. Xem Hàm gọi lại để biết ví dụ. ctypes. CFUNCTYPE(gõ lại , *argtypes, use_errno=False, use_last_error=False)¶ Nguyên mẫu hàm được trả về tạo các hàm sử dụng quy ước gọi C tiêu chuẩn. Chức năng sẽ giải phóng GIL trong khi gọi. Nếu use_errno được đặt thành true, bản sao riêng ctypes của biến >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "931 hệ thống được trao đổi với giá trị thực >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "931 trước và sau cuộc gọi; ctypes. WINFUNCTYPE(gõ lại , *argtypes, use_errno=False, use_last_error=False)¶ chỉ cửa sổ. Nguyên mẫu hàm được trả về tạo ra các hàm sử dụng quy ước gọi >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>0. Chức năng sẽ giải phóng GIL trong khi gọi. use_errno và use_last_error có cùng ý nghĩa như trênctypes. 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
Ví dụ này trình bày cách bọc chức năng Windows >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "986 để nó hỗ trợ các tham số mặc định và các đối số được đặt tên. Khai báo C từ tệp tiêu đề windows là đây >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "19 Đây là gói với >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "50 Chức năng nước ngoài >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "988 hiện có thể được gọi theo những cách này >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "51 Một ví dụ thứ hai minh họa các tham số đầu ra. Hàm win32 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "990 mà người gọi phải cung cấp. Đây là khai báo C >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "52 Đây là gói với >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "53 Các hàm có tham số đầu ra sẽ tự động trả về giá trị tham số đầu ra nếu có một giá trị duy nhất hoặc một bộ chứa các giá trị tham số đầu ra khi có nhiều hơn một giá trị, vì vậy hàm GetWindowRect hiện trả về một phiên bản RECT khi được gọi Các tham số đầu ra có thể được kết hợp với giao thức >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "989 trả về một >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "994 để báo hiệu thành công hay thất bại, vì vậy hàm này có thể thực hiện kiểm tra lỗi và đưa ra một ngoại lệ khi lệnh gọi api không thành công >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "54 Nếu hàm >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "086 trả về bộ đối số mà nó nhận được không thay đổi, thì >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 sẽ tiếp tục quá trình xử lý bình thường mà nó thực hiện trên các tham số đầu ra. Nếu bạn muốn trả về một bộ tọa độ cửa sổ thay vì một phiên bản >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "990, bạn có thể truy xuất các trường trong hàm và trả lại chúng, quá trình xử lý thông thường sẽ không diễn ra nữa >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "55 Các chức năng tiện ích¶ctypes. địa chỉ của(đối tượng) ¶Trả về địa chỉ của bộ nhớ đệm dưới dạng số nguyên. obj phải là một thể hiện của kiểu ctypes Tăng sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "998 với đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "999. ctypes. căn chỉnh(obj_or_type) ¶ Trả về các yêu cầu căn chỉnh của một loại ctypes. obj_or_type phải là loại ctypes hoặc thể hiện ctypes. byref(obj[ , offset])¶Trả về một con trỏ light-weight cho obj, con trỏ này phải là một thể hiện của kiểu ctypes. offset mặc định bằng 0 và phải là số nguyên sẽ được thêm vào giá trị con trỏ bên trong >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "400 tương ứng với mã C này >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "56 Đối tượng được trả về chỉ có thể được sử dụng làm tham số gọi hàm nước ngoài. Nó hoạt động tương tự như >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "401, nhưng việc xây dựng nhanh hơn rất nhiềuctypes. truyền(đối tượng , loại)¶ Hàm này tương tự như toán tử ép kiểu trong C. Nó trả về một phiên bản mới của loại trỏ đến cùng một khối bộ nhớ như obj. loại phải là loại con trỏ và obj phải là đối tượng có thể được hiểu là con trỏ ctypes. create_string_buffer(init_or_size , size=None)¶Hàm này tạo bộ đệm ký tự có thể thay đổi. Đối tượng được trả về là một mảng ctypes của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "028 init_or_size phải là một số nguyên chỉ định kích thước của mảng hoặc một đối tượng byte sẽ được sử dụng để khởi tạo các mục mảng Nếu một đối tượng byte được chỉ định làm đối số đầu tiên, thì bộ đệm được tạo một mục lớn hơn độ dài của nó để phần tử cuối cùng trong mảng là ký tự kết thúc NUL. Một số nguyên có thể được truyền dưới dạng đối số thứ hai, cho phép chỉ định kích thước của mảng nếu không nên sử dụng độ dài của byte Tăng sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "403 với các đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "404, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "281. ctypes. create_unicode_buffer(init_or_size , size=None)¶ Hàm này tạo bộ đệm ký tự unicode có thể thay đổi. Đối tượng được trả về là một mảng ctypes của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "029 init_or_size phải là một số nguyên chỉ định kích thước của mảng hoặc một chuỗi sẽ được sử dụng để khởi tạo các mục mảng Nếu một chuỗi được chỉ định làm đối số đầu tiên, bộ đệm được tạo một mục lớn hơn độ dài của chuỗi sao cho phần tử cuối cùng trong mảng là ký tự kết thúc NUL. Một số nguyên có thể được truyền dưới dạng đối số thứ hai, cho phép chỉ định kích thước của mảng nếu không nên sử dụng độ dài của chuỗi Tăng sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "407 với các đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "404, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "281. ctypes. DllCanUnloadNow() ¶ chỉ cửa sổ. Chức năng này là một hook cho phép triển khai các máy chủ COM đang xử lý với ctypes. Nó được gọi từ hàm DllCanUnloadNow mà dll mở rộng _ctypes xuất ctypes. DllGetClassObject() ¶chỉ cửa sổ. Chức năng này là một hook cho phép triển khai các máy chủ COM đang xử lý với ctypes. Nó được gọi từ hàm DllGetClassObject mà dll mở rộng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "410 xuấtctypes. sử dụng. find_library(tên) ¶ Cố gắng tìm thư viện và trả lại tên đường dẫn. name là tên thư viện không có bất kỳ tiền tố nào như >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "411, hậu tố như >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "903, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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 "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 "014 Chức năng chính xác phụ thuộc vào hệ thống ctypes. sử dụng. find_msvcrt() ¶chỉ cửa sổ. trả lại tên tệp của thư viện thời gian chạy VC được sử dụng bởi Python và bởi các mô-đun mở rộng. Nếu không xác định được tên thư viện, trả về ____2014 Ví dụ: nếu bạn cần giải phóng bộ nhớ, được cấp phát bởi một mô-đun mở rộng bằng lệnh gọi tới >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "417, thì điều quan trọng là bạn phải sử dụng hàm trong cùng thư viện đã cấp phát bộ nhớctypes. Lỗi định dạng([mã])¶ chỉ cửa sổ. Trả về mô tả bằng văn bản của mã mã lỗi. Nếu không có mã lỗi nào được chỉ định, mã lỗi cuối cùng được sử dụng bằng cách gọi hàm api Windows GetLastError ctypes. GetLastError() ¶chỉ cửa sổ. Trả về mã lỗi cuối cùng do Windows đặt trong chuỗi cuộc gọi. Hàm này gọi trực tiếp hàm Windows >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "085, nó không trả về bản sao mã lỗi ctypes-privatectypes. get_errno() ¶ Trả về giá trị hiện tại của bản sao ctypes-private của biến >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "931 hệ thống trong luồng gọi Tăng sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "420 mà không có đối số. ctypes. get_last_error() ¶ chỉ cửa sổ. trả về giá trị hiện tại của bản sao ctypes-private của biến >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "421 hệ thống trong luồng gọi Tăng sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "422 không có đối số. ctypes. memmove(dst , src, count)¶ Giống như chức năng thư viện C memmove tiêu chuẩn. bản sao đếm byte từ src đến dst. dst và src phải là các trường hợp số nguyên hoặc ctypes có thể được chuyển đổi thành con trỏ ctypes. bộ nhớ(dst , c, count)¶Giống như chức năng thư viện bộ nhớ C tiêu chuẩn. lấp đầy khối bộ nhớ tại địa chỉ dst với số byte giá trị c. dst phải là một số nguyên chỉ định một địa chỉ hoặc một phiên bản ctypes ctypes. POINTER(loại) ¶Hàm xuất xưởng này tạo và trả về một loại con trỏ ctypes mới. Các loại con trỏ được lưu vào bộ nhớ cache và được sử dụng lại trong nội bộ, vì vậy việc gọi hàm này nhiều lần sẽ rẻ. loại phải là loại ctypes ctypes. con trỏ(obj) ¶Hàm này tạo một thể hiện con trỏ mới, trỏ tới obj. Đối tượng được trả về thuộc loại >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "423 Ghi chú. Nếu bạn chỉ muốn chuyển một con trỏ tới một đối tượng cho một lệnh gọi hàm lạ, bạn nên sử dụng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "424 nhanh hơn nhiềuctypes. thay đổi kích thước(obj , kích thước)¶ Hàm này thay đổi kích thước bộ đệm bộ nhớ trong của obj, đây phải là một phiên bản của loại ctypes. Không thể làm cho bộ đệm nhỏ hơn kích thước gốc của loại đối tượng, như được cung cấp bởi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "425, nhưng có thể phóng to bộ đệmctypes. set_errno(giá trị) ¶ Đặt giá trị hiện tại của bản sao ctypes-private của biến >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "931 hệ thống trong luồng gọi thành giá trị và trả về giá trị trước đó Tăng sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "427 với đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "931. ctypes. set_last_error(giá trị) ¶ chỉ cửa sổ. đặt giá trị hiện tại của bản sao ctypes-private của biến >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "421 hệ thống trong luồng gọi thành giá trị và trả về giá trị trước đó Tăng sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "430 với đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "431. ctypes. sizeof(obj_or_type) ¶ Trả về kích thước tính bằng byte của loại ctypes hoặc bộ đệm bộ nhớ thể hiện. Làm giống như toán tử C >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "432ctypes. string_at(địa chỉ , kích thước=- 1)¶ Hàm này trả về chuỗi C bắt đầu tại địa chỉ địa chỉ bộ nhớ dưới dạng đối tượng byte. Nếu kích thước được chỉ định, thì nó được sử dụng làm kích thước, nếu không thì chuỗi được coi là không kết thúc Tăng sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "433 với các đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "434, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "281. ctypes. WinError(mã=Không, descr=None)¶ chỉ cửa sổ. chức năng này có lẽ là thứ tồi tệ nhất trong ctypes. Nó tạo ra một thể hiện của OSError. Nếu mã không được chỉ định, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "436 được gọi để xác định mã lỗi. Nếu descr không được chỉ định, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "437 được gọi để nhận mô tả bằng văn bản về lỗi Đã thay đổi trong phiên bản 3. 3. Một phiên bản của >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>>4 đã từng được tạo. ctypes. wstring_at(địa chỉ , kích thước=- 1)¶ Hàm này trả về chuỗi ký tự rộng bắt đầu từ địa chỉ địa chỉ bộ nhớ dưới dạng chuỗi. Nếu kích thước được chỉ định, thì nó được sử dụng làm số ký tự của chuỗi, nếu không thì chuỗi được coi là không kết thúc Tăng sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "439 với các đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "434, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "281. Loại dữ liệu¶lớp ctypes. _CData ¶Lớp không công khai này là lớp cơ sở chung của tất cả các kiểu dữ liệu ctypes. Trong số những thứ khác, tất cả các phiên bản loại ctypes chứa một khối bộ nhớ chứa dữ liệu tương thích với C; . Một biến thể hiện khác được hiển thị là >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "443; Các phương thức phổ biến của kiểu dữ liệu ctypes, đây đều là các phương thức của lớp (chính xác thì chúng là các phương thức của siêu lớp ). from_buffer(nguồn[ , offset])¶Phương thức này trả về một thể hiện ctypes chia sẻ bộ đệm của đối tượng nguồn. Đối tượng nguồn phải hỗ trợ giao diện bộ đệm có thể ghi. Tham số offset tùy chọn chỉ định một offset vào bộ đệm nguồn theo byte; . Nếu bộ đệm nguồn không đủ lớn, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "016 sẽ được nâng lên Tăng sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "445 với các đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "278, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "281, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "448. from_buffer_copy(nguồn[ , offset])¶ Phương thức này tạo một thể hiện ctypes, sao chép bộ đệm từ bộ đệm đối tượng nguồn phải có thể đọc được. Tham số offset tùy chọn chỉ định một offset vào bộ đệm nguồn theo byte; . Nếu bộ đệm nguồn không đủ lớn, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "016 sẽ được nâng lên Tăng sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "445 với các đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "278, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "281, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "448. from_address(địa chỉ) ¶ Phương thức này trả về một thể hiện kiểu ctypes sử dụng bộ nhớ được chỉ định bởi địa chỉ phải là một số nguyên Phương thức này và các phương thức khác gián tiếp gọi phương thức này, tạo ra một sự kiện kiểm tra >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "454 với đối số >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "434. from_param(obj) ¶ Phương pháp này điều chỉnh obj thành loại ctypes. Nó được gọi với đối tượng thực tế được sử dụng trong lệnh gọi hàm ngoại khi loại có trong bộ dữ liệu >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "062 của hàm ngoại; Tất cả các kiểu dữ liệu ctypes đều có triển khai mặc định của phương thức lớp này thường trả về obj nếu đó là một thể hiện của kiểu. Một số loại cũng chấp nhận các đối tượng khác in_dll(thư viện , tên)¶Phương thức này trả về một thể hiện kiểu ctypes được xuất bởi một thư viện dùng chung. tên là tên của biểu tượng xuất dữ liệu, thư viện là thư viện được chia sẻ đã tải Các biến thể hiện phổ biến của kiểu dữ liệu ctypes _b_base_ ¶Đôi khi các phiên bản dữ liệu ctypes không sở hữu khối bộ nhớ mà chúng chứa, thay vào đó chúng chia sẻ một phần khối bộ nhớ của một đối tượng cơ sở. Thành viên chỉ đọc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "457 là đối tượng ctypes gốc sở hữu khối bộ nhớ_b_needsfree_ ¶ Biến chỉ đọc này là đúng khi cá thể dữ liệu ctypes đã tự cấp phát khối bộ nhớ, ngược lại là sai _đối tượng ¶Thành viên này là >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "014 hoặc một từ điển chứa các đối tượng Python cần được duy trì để nội dung khối bộ nhớ được giữ hợp lệ. Đối tượng này chỉ được hiển thị để gỡ lỗi; Các kiểu dữ liệu cơ bản¶lớp ctypes. _SimpleCData ¶Lớp không công khai này là lớp cơ sở của tất cả các kiểu dữ liệu ctypes cơ bản. Nó được đề cập ở đây vì nó chứa các thuộc tính chung của các kiểu dữ liệu ctypes cơ bản. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "459 là lớp con của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "460 nên nó kế thừa các phương thức và thuộc tính của chúng. các loại dữ liệu ctypes không và không chứa con trỏ giờ đây có thể được chọn Các trường hợp có một thuộc tính duy nhất giá trị ¶Thuộc tính này chứa giá trị thực của thể hiện. Đối với các loại số nguyên và con trỏ, nó là một số nguyên, đối với các loại ký tự, nó là một đối tượng hoặc chuỗi byte ký tự đơn, đối với các loại con trỏ ký tự, nó là một đối tượng hoặc chuỗi byte Python Khi thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "056 được truy xuất từ một phiên bản ctypes, thường thì một đối tượng mới được trả về mỗi lần. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 không triển khai trả về đối tượng ban đầu, luôn tạo đối tượng mới. Điều này cũng đúng với tất cả các trường hợp đối tượng ctypes khác Các kiểu dữ liệu cơ bản, khi được trả về dưới dạng kết quả gọi hàm ngoại, hoặc, ví dụ, bằng cách truy xuất các thành viên trường cấu trúc hoặc các mục mảng, được chuyển đổi rõ ràng thành các kiểu Python gốc. Nói cách khác, nếu một hàm nước ngoài có >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "077 của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "045, bạn sẽ luôn nhận được một đối tượng byte Python, không phải là một phiên bản >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "045 Các lớp con của các kiểu dữ liệu cơ bản không kế thừa hành vi này. Vì vậy, nếu một hàm ngoại >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "077 là một lớp con của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "049, bạn sẽ nhận được một thể hiện của lớp con này từ lời gọi hàm. Tất nhiên, bạn có thể lấy giá trị của con trỏ bằng cách truy cập thuộc tính >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "056 Đây là những kiểu dữ liệu ctypes cơ bản lớp ctypes. c_byte ¶Đại diện cho kiểu dữ liệu C signed char và diễn giải giá trị dưới dạng số nguyên nhỏ. Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; . lớp ctypes. c_char ¶Đại diện cho kiểu dữ liệu C char và diễn giải giá trị dưới dạng một ký tự. Hàm tạo chấp nhận một trình khởi tạo chuỗi tùy chọn, độ dài của chuỗi phải chính xác là một ký tự. lớp ctypes. c_char_p ¶Đại diện cho kiểu dữ liệu C char* khi nó trỏ đến một chuỗi có tận cùng bằng 0. Đối với một con trỏ ký tự chung cũng có thể trỏ đến dữ liệu nhị phân, phải sử dụng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "469. Hàm tạo chấp nhận một địa chỉ số nguyên hoặc đối tượng byte. lớp ctypes. c_double ¶ Đại diện cho kiểu dữ liệu C double . Hàm tạo chấp nhận một trình khởi tạo float tùy chọn. lớp ctypes. c_longdouble ¶Đại diện cho kiểu dữ liệu C long double . Hàm tạo chấp nhận một trình khởi tạo float tùy chọn. Trên các nền tảng có >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "470, đó là bí danh của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "043. lớp ctypes. c_float ¶ Đại diện cho kiểu dữ liệu C float . Hàm tạo chấp nhận một trình khởi tạo float tùy chọn. lớp ctypes. c_int ¶Đại diện cho kiểu dữ liệu C signed int . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; . Trên các nền tảng có >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "472, đó là bí danh của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "5. lớp ctypes. c_int8 ¶ Đại diện cho kiểu dữ liệu C 8-bit signed int . Thường là bí danh cho >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "030. lớp ctypes. c_int16 ¶ Đại diện cho kiểu dữ liệu C 16-bit signed int . Thường là bí danh cho >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "032. lớp ctypes. c_int32 ¶ Đại diện cho kiểu dữ liệu C 32-bit signed int . Thường là bí danh cho >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "3. lớp ctypes. c_int64 ¶ Đại diện cho kiểu dữ liệu C 64-bit signed int . Thường là bí danh cho >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "038. lớp ctypes. c_long ¶ Đại diện cho kiểu dữ liệu C signed long . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; . lớp ctypes. c_longlong ¶Đại diện cho kiểu dữ liệu C signed long long . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; . lớp ctypes. c_short ¶Đại diện cho kiểu dữ liệu C signed short . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; . lớp ctypes. c_size_t ¶Đại diện cho kiểu dữ liệu C >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "478lớp ctypes. c_ssize_t ¶ Đại diện cho kiểu dữ liệu C >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "479 Mới trong phiên bản 3. 2 lớp ctypes. c_ubyte ¶Đại diện cho kiểu dữ liệu C unsigned char , nó diễn giải giá trị dưới dạng số nguyên nhỏ. Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; . lớp ctypes. c_uint ¶Đại diện cho kiểu dữ liệu C unsigned int . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; . Trên các nền tảng có >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "472, đó là bí danh của >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "037. lớp ctypes. c_uint8 ¶ Đại diện cho kiểu dữ liệu C 8-bit unsigned int . Thường là bí danh cho >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "031. lớp ctypes. c_uint16 ¶ Đại diện cho kiểu dữ liệu C 16-bit unsigned int . Thường là bí danh cho >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "033. lớp ctypes. c_uint32 ¶ Đại diện cho kiểu dữ liệu C 32-bit unsigned int . Thường là bí danh cho >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "035. lớp ctypes. c_uint64 ¶ Đại diện cho kiểu dữ liệu C 64-bit unsigned int . Thường là bí danh cho >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "039. lớp ctypes. c_ulong ¶ Đại diện cho kiểu dữ liệu C unsigned long . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; . lớp ctypes. c_ulonglong ¶Đại diện cho kiểu dữ liệu C unsigned long long . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; . lớp ctypes. c_ushort ¶Đại diện cho kiểu dữ liệu C unsigned short . Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn; . lớp ctypes. c_void_p ¶Đại diện cho loại C void* . Giá trị được biểu diễn dưới dạng số nguyên. Hàm tạo chấp nhận một trình khởi tạo số nguyên tùy chọn. lớp ctypes. c_wchar ¶Đại diện cho kiểu dữ liệu C wchar_t và diễn giải giá trị dưới dạng một chuỗi unicode ký tự đơn. Hàm tạo chấp nhận một trình khởi tạo chuỗi tùy chọn, độ dài của chuỗi phải chính xác là một ký tự. lớp ctypes. c_wchar_p ¶Đại diện cho kiểu dữ liệu C wchar_t* , kiểu dữ liệu này phải là một con trỏ tới một chiều rộng kết thúc bằng 0 . Hàm tạo chấp nhận một địa chỉ số nguyên hoặc một chuỗi. lớp ctypes. c_bool ¶Đại diện cho kiểu dữ liệu C bool (chính xác hơn là _Bool from C99). Its value can be >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "486 or >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "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ọilớp ctypes. py_object ¶ Đại diện cho kiểu dữ liệu C PyObject* . Gọi điều này mà không có đối số sẽ tạo ra một con trỏ >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "013 PyObject* . Mô-đun >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "490 cung cấp khá nhiều loại dữ liệu cụ thể khác của Windows, ví dụ: >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "491, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "492 hoặc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "493. Một số cấu trúc hữu ích như >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "494 hoặc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "990 cũng được định nghĩa Kiểu dữ liệu có cấu trúc¶lớp ctypes. Liên minh(*args , **kw)¶Lớp cơ sở trừu tượng cho các công đoàn theo thứ tự byte gốc lớp ctypes. BigEndianUnion(*args , **kw)¶Lớp cơ sở trừu tượng cho các công đoàn theo thứ tự byte cuối lớn Mới trong phiên bản 3. 11 lớp ctypes. LittleEndianUnion(*args , **kw)¶Lớp cơ sở trừu tượng cho các công đoàn theo thứ tự byte cuối nhỏ Mới trong phiên bản 3. 11 lớp ctypes. BigEndianStructure(*args , **kw)¶Lớp cơ sở trừu tượng cho các cấu trúc theo thứ tự byte cuối lớn lớp ctypes. LittleEndianStructure(*args , **kw)¶Lớp cơ sở trừu tượng cho các cấu trúc theo thứ tự byte cuối nhỏ Các cấu trúc và liên kết với thứ tự byte không phải gốc không thể chứa các trường loại con trỏ hoặc bất kỳ loại dữ liệu nào khác có chứa các trường loại con trỏ lớp ctypes. Cấu trúc(*args , **kw)¶Lớp cơ sở trừu tượng cho các cấu trúc theo thứ tự byte gốc Các kiểu liên kết và cấu trúc cụ thể phải được tạo bằng cách phân lớp con của một trong các kiểu này và ít nhất là xác định một biến lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 sẽ tạo bộ mô tả cho phép đọc và ghi các trường bằng cách truy cập thuộc tính trực tiếp. Đây là_fields_ ¶ Trình tự xác định các trường cấu trúc. Các mục phải là 2-bộ hoặc 3-bộ. Mục đầu tiên là tên của trường, mục thứ hai chỉ định loại trường; Đối với các trường loại số nguyên như >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "3, có thể cung cấp mục tùy chọn thứ ba. Nó phải là một số nguyên dương nhỏ xác định độ rộng bit của trường Tên trường phải là duy nhất trong một cấu trúc hoặc liên kết. Điều này không được kiểm tra, chỉ có thể truy cập một trường khi tên được lặp lại Có thể định nghĩa biến lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095 sau câu lệnh lớp định nghĩa lớp con Cấu trúc, điều này cho phép tạo các kiểu dữ liệu trực tiếp hoặc gián tiếp tham chiếu đến chính chúng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "57 Tuy nhiên, biến lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095 phải được xác định trước khi loại được sử dụng lần đầu tiên (một thể hiện được tạo, >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "501 được gọi trên nó, v.v.). Các phép gán sau này cho biến lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095 sẽ gây ra AttributeError Có thể định nghĩa các lớp con con của các kiểu cấu trúc, chúng kế thừa các trường của lớp cơ sở cộng với >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095 được định nghĩa trong lớp con con, nếu có_pack_ ¶ Một số nguyên nhỏ tùy chọn cho phép ghi đè căn chỉnh của các trường cấu trúc trong ví dụ. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "201 phải được xác định khi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095 được chỉ định, nếu không nó sẽ không có hiệu lực_anonymous_ ¶ Một chuỗi tùy chọn liệt kê tên của các trường chưa được đặt tên (ẩn danh). >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "506 phải được xác định trước khi gán >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095, nếu không nó sẽ không có hiệu lực Các trường được liệt kê trong biến này phải là trường kiểu cấu trúc hoặc liên kết. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 sẽ tạo các bộ mô tả theo kiểu cấu trúc cho phép truy cập trực tiếp các trường lồng nhau mà không cần tạo cấu trúc hoặc trường hợp Đây là một loại ví dụ (Windows) >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "58 Cấu trúc >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "509 mô tả kiểu dữ liệu COM, trường >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "510 chỉ định trường hợp nào hợp lệ. Vì trường >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "511 được xác định là trường ẩn danh, nên giờ đây có thể truy cập trực tiếp vào các thành viên từ phiên bản TYPEDESC. >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "512 và >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "513 là tương đương, nhưng cái trước nhanh hơn vì nó không cần tạo một thể hiện hợp nhất tạm thời >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "59 Có thể định nghĩa các lớp con của cấu trúc, chúng kế thừa các trường của lớp cơ sở. Nếu định nghĩa lớp con có một biến >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095 riêng biệt, thì các trường được chỉ định trong phần này sẽ được thêm vào các trường của lớp cơ sở Các hàm tạo cấu trúc và liên kết chấp nhận cả đối số vị trí và từ khóa. Các đối số vị trí được sử dụng để khởi tạo các trường thành viên theo cùng thứ tự như chúng xuất hiện trong >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095. Các đối số từ khóa trong hàm tạo được hiểu là các phép gán thuộc tính, vì vậy chúng sẽ khởi tạo >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095 với cùng tên hoặc tạo các thuộc tính mới cho các tên không có trong >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "095 Mảng và con trỏ¶lớp ctypes. Mảng(*args)¶Lớp cơ sở trừu tượng cho mảng Cách khuyến nghị để tạo các kiểu mảng cụ thể là nhân bất kỳ kiểu dữ liệu >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "0 nào với một số nguyên không âm. Ngoài ra, bạn có thể phân lớp loại này và xác định các biến lớp >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "519 và >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "520. Các phần tử mảng có thể được đọc và ghi bằng cách sử dụng các truy cập lát cắt và chỉ số con tiêu chuẩn; _length_ ¶ Một số nguyên dương xác định số phần tử trong mảng. Các chỉ số nằm ngoài phạm vi dẫn đến >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "522. Sẽ được trả lại bởi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "523_type_ ¶ Chỉ định kiểu của từng phần tử trong mảng Các hàm tạo của lớp con mảng chấp nhận các đối số vị trí, được sử dụng để khởi tạo các phần tử theo thứ tự lớp ctypes. _Con trỏ ¶Lớp cơ sở trừu tượng, riêng tư cho con trỏ Các loại con trỏ cụ thể được tạo bằng cách gọi >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "217 với loại sẽ được trỏ tới; Nếu một con trỏ trỏ đến một mảng, các phần tử của nó có thể được đọc và ghi bằng cách sử dụng các truy cập lát cắt và chỉ số con tiêu chuẩn. Các đối tượng con trỏ không có kích thước, vì vậy >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "523 sẽ tăng >>> windll.kernel32.GetModuleHandleA(32) Traceback (most recent call last): File "527. Các chỉ số âm sẽ đọc từ bộ nhớ trước con trỏ (như trong C) và các chỉ số ngoài phạm vi có thể sẽ bị lỗi do vi phạm quyền truy cập (nếu bạn may mắn)_type_ ¶ Chỉ định loại trỏ đến nội dung ¶Trả về đối tượng mà con trỏ trỏ tới. Việc gán cho thuộc tính này sẽ thay đổi con trỏ trỏ đến đối tượng được gán Tại sao con trỏ không được sử dụng trong Python?Python có xu hướng cố gắng trừu tượng hóa các chi tiết triển khai như địa chỉ bộ nhớ từ người dùng của nó. Python thường tập trung vào khả năng sử dụng thay vì tốc độ . Kết quả là, con trỏ trong Python không thực sự có ý nghĩa. Mặc dù vậy, đừng sợ, theo mặc định, Python cung cấp cho bạn một số lợi ích của việc sử dụng con trỏ.
Các loại con trỏ có được hỗ trợ trong Python không?Không, chúng tôi không có bất kỳ loại Con trỏ nào trong ngôn ngữ Python . Các đối tượng được truyền cho hàm theo tham chiếu. Cơ chế được sử dụng trong Python giống hệt như truyền con trỏ theo giá trị trong C. Chúng tôi có các biến Python không phải là con trỏ.
Tại sao con trỏ không được sử dụng trong Java và Python?Vì vậy, tổng thể Java không có con trỏ (theo nghĩa C/C++) bởi vì nó không cần chúng cho lập trình OOP mục đích chung. Furthermore, adding pointers to Java would undermine security and robustness and make the language more complex.
Tại sao con trỏ được sử dụng trong Python?Con trỏ có thể được coi là tên - tức là các mục nhập trong không gian tên của Python - tương ứng với các đối tượng trong bộ nhớ của Python . Trong ví dụ trên, con trỏ là my_string và đối tượng trong bộ nhớ là chuỗi có giá trị "Hello World. ". |