ctypes.cast.

>>> import ctypes
>>> c_long_p = ctypes.POINTER(ctypes.c_long)
>>> some_long = ctypes.c_long(42)
>>> ctypes.addressof(some_long)
4300833936
>>> ctypes.cast(4300833936, c_long_p)
<__main__.LP_c_long object at 0x1005983b0>
>>> ctypes.cast(4300833936, c_long_p).contents
c_long(42)
Answer from habnabit on Stack Overflow
🌐
Python
docs.python.org › 3 › library › ctypes.html
ctypes — A foreign function library for Python
>>> null_ptr = POINTER(c_int)() >>> print(bool(null_ptr)) False >>> ctypes checks for NULL when dereferencing pointers (but dereferencing invalid non-NULL pointers would crash Python):
🌐
tentacles666
tentacles666.wordpress.com › 2012 › 01 › 21 › python-ctypes-dereferencing-a-pointer-to-a-c
Python ctypes: dereferencing a pointer to a C structure | tentacles666
March 19, 2013 - Next, you need to tell ctypes that newfoo() returns a pointer to such a thing: ... Finally, after invoking newfoo(), you need to use the pointer’s contents member to dereference it:
Discussions

Dereferencing C function pointer inside a struct in Python/ctypes - Stack Overflow
I have the following struct and function declaration in C: typedef int (*callback)(struct instance *); typedef struct instance { int x; callback f; } instance; What would be the proper wa... More on stackoverflow.com
🌐 stackoverflow.com
December 14, 2020
CTypes NASM - how to dereference a pointer to an array of pointers - Stack Overflow
UPDATE: the code below DOES work to dereference the pointer. I had incorrectly inserted some lines at the entry point that had the effect of overriding the memory location f1_ptr. The important ... More on stackoverflow.com
🌐 stackoverflow.com
Dereferencing pointer to array of strings in Python ctypes - Stack Overflow
The newp_usb_get_model_serial_keys function is successful, but I've been having trouble dereferencing the pbuf pointer. I've struggled to understand some methods such as using cast() (and I'm not sure if that's what's best to use anyway), and using pbuf.contents simply returns · More on stackoverflow.com
🌐 stackoverflow.com
May 31, 2018
ctypes: return a pointer to a struct - Post.Byes - Bytes
Re: ctypes: return a pointer to a struct That worked. Thank you! >AttributeError : 'LP_IP2Location Record' object has no attribute >'country_short ' > As it says, LP_IP2LocationR ecord has no attribute called 'country_short' . IP2LocationReco rd does. > Use the 'contents' attribute to dereference ... More on post.bytes.com
🌐 post.bytes.com
🌐
GeeksforGeeks
geeksforgeeks.org › using-pointers-in-python-using-ctypes
Using Pointers in Python using ctypes - GeeksforGeeks
January 9, 2023 - In languages like C/C++ pointers ... that pointer variable i.e while printing it we put the certain format specifier and then use an asterisk (*) with that variable to get the value it was pointing....
🌐
CodersLegacy
coderslegacy.com › home › python › using pointers with ctypes and python
Using Pointers with Ctypes and Python - CodersLegacy
July 8, 2022 - We can use .contents.value to deference it, but instead we used a different approach to create a new string object from the pointer. We can access this string’s value by using .value attribute. At the end, make sure to call the free memory function, else there will be a memory leak. Here is the complete compiled code. import ctypes clibrary = ctypes.CDLL('clibrary.so') # Defining alloc function and it's return type alloc_func = clibrary.alloc_memory alloc_func.restype = ctypes.POINTER(ctypes.c_char) # Defining free function and it's return type free_func = clibrary.free_memory free_func.argtypes = [ctypes.POINTER(ctypes.c_char)] # Using the function to return a string cstring_pointer = alloc_func() str = ctypes.c_char_p.from_buffer(cstring_pointer) print(str.value) # Freeing memory free_func(cstring_pointer)
🌐
Netlify
pointerspy.netlify.app › reference
Reference - pointers.py
Dereference the pointer. ... Move/copy a value into the memory at the pointers address. ... Base class for a pointer that has a size attribute. ... Size of the target value. Convert the address to a ctypes pointer.
Top answer
1 of 1
1

Function pointers can use CFUNCTYPE(retval,params...) to declare C function pointers. The code below is a guess based on the description and minimal code:

test.c

#if defined(_WIN32)
#   define API __declspec(dllexport)
#else
#   define API
#endif

#include <stdlib.h>

struct instance; // forward declaration...

typedef int (*callback)(struct instance *); // so callback can be defined...

typedef struct instance { // and structure declared.
    int x;
    callback f;
} instance;

int func(instance* p) {  // Callback
    return ++p->x;
}

API instance* get_instance(void) {
    instance* p = malloc(sizeof(instance));
    p->x = 5;
    p->f = func;
    return p;
}

API void free_instance(instance* p) {
    free(p);
}

test.py

from ctypes import *

# Forward declaration...
class Instance(Structure):
    pass

# so the callback parameter pointer can be declared...
CALLBACK = CFUNCTYPE(c_int,POINTER(Instance))

# and then the fields can be defined.
Instance._fields_ = (('x',c_int),
                     ('f',CALLBACK))

dll = CDLL('./test')
dll.get_instance.argtypes = ()
dll.get_instance.restype = POINTER(Instance)
dll.free_instance.argtypes = POINTER(Instance),
dll.free_instance.restype = None

instance = dll.get_instance()
try:
    print(instance.contents.x)
    print(instance.contents.f(instance))
    print(instance.contents.f(instance))
    print(instance.contents.f(instance))
finally:
    dll.free_instance(instance)

Output:

5
6
7
8

References:

  • https://docs.python.org/3/library/ctypes.html#incomplete-types
  • https://docs.python.org/3/library/ctypes.html#callback-functions
🌐
Stack Overflow
stackoverflow.com › questions › 54353482 › ctypes-nasm-how-to-dereference-a-pointer-to-an-array-of-pointers
CTypes NASM - how to dereference a pointer to an array of pointers - Stack Overflow
UPDATE: the code below DOES work to dereference the pointer. I had incorrectly inserted some lines at the entry point that had the effect of overriding the memory location f1_ptr. The important ...
Find elsewhere
🌐
Behaviour
behaviour.space › posts › 2021-03-28-ctypes-weird-and-inconvenient-typing.html
The weird and inconvenient typing of Python's ctypes library
March 28, 2021 - Alternatively create a directory called example and place an Example.hs file in it filled with these file contents. Then install Pythas using pip and run python. Using Valgrind’s own massif memory profiler I created two graphs showing the issue. In the first graph we’ll use the code from above. Pythas is designed with this issue in mind. It doesn’t actually hand over char-pointers but char-pointer-pointers! Hence, ctypes doesn’t automatically convert the string and we can dereference the pointer after conversion.
🌐
Python
docs.python.org › 2.5 › lib › ctypes-pointers.html
14.14.1.14 Pointers
December 23, 2008 - >>> null_ptr = POINTER(c_int)() >>> print bool(null_ptr) False >>> ctypes checks for NULL when dereferencing pointers (but dereferencing non-NULL pointers would crash Python):
🌐
Tomerfiliba
tomerfiliba.com › recipes › ctype-pointers
ctypes - Pointer from Address - Tomer Filiba
import ctypes def deref(addr, typ): return ctypes.cast(addr, ctypes.POINTER(typ)).contents · # get the ref count of an object (in a very nasty way :) >>> x="hello world" >>> deref(id(x), ctypes.c_int) c_long(1) >>> y=x >>> z=x >>> deref(id(x), ctypes.c_int) c_long(3) ... I’m relying here on id returning the address of an object. This is a weak assumption, but it holds (and is likely to continue to hold) for CPython. There are APIs for what I showed in the example above…
🌐
Real Python
realpython.com › lessons › real-pointers-ctypes
Real Pointers With ctypes (Video) – Real Python
It should take a pointer to an integer, so I should be sure the parameter is int*. 01:30 Now I can dereference the parameter with the & (dereference) operator and increment the value by 1. This is a trivial example of a C function, similar to ...
Published: July 7, 2020
🌐
Post.Byes
post.bytes.com › home › forum › topic › python
ctypes: return a pointer to a struct - Post.Byes - Bytes
> Which is to say: > import ctypes > class IP2LocationReco rd(ctypes.Struc ture): _fields_ = [ ('country_short ', ctypes.c_char_p ), ('country_long' , ctypes.c_char_p ), ('region', ctypes.c_char_p ), ('city', ctypes.c_char_p ), ('isp', ctypes.c_char_p ), ('latitude', ctypes.c_float) , ('longitude', ctypes.c_float) , ('domain', ctypes.c_char_p ), ('zipcode', ctypes.c_char_p ), ('timezone', ctypes.c_char_p ), ('netspeed', ctypes.c_char_p ), ] > IP2LocationReco rd_Ptr_t = ctypes.POINTER( IP2LocationReco rd) > function.restyp e = IP2LocationReco rd_Ptr_t > > ... AttributeError: 'LP_IP2Location Record' object has no attribute 'country_short' As it says, LP_IP2LocationR ecord has no attribute called 'country_short' . IP2LocationReco rd does. Use the 'contents' attribute to dereference the pointer.
🌐
Dsheets
dsheets.github.io › codoc › ctypes.0.3.4 › _build › src › ctypes › ctypes
Ctypes
A null pointer. ... !@ p dereferences the pointer p. If the reference type is a scalar type then dereferencing constructs a new value.
🌐
Reddit
reddit.com › r/learnpython › how do i dereference(?) a handle retrieved from ctypes.windll?
r/learnpython on Reddit: How do I dereference(?) a handle retrieved from ctypes.windll?
March 27, 2016 -

I have literally no idea what I'm doing here, I love it. I've gotten this far:

from ctypes import Structure, c_ulong, c_long, c_ushort, cast, POINTER, windll

class BITMAPINFOHEADER(Structure):
    _fields_ = [
        ("biSize", c_ulong),
        ("biWidth", c_long),
        ("biHeight", c_long),
        ("biPlanes", c_ushort),
        ("biBitCount", c_ushort),
        ("biCompression", c_ulong),
        ("biSizeImage", c_ulong),
        ("biXPelsPerMeter", c_long),
        ("biYPelsPerMeter", c_long),
        ("biClrUsed", c_ulong),
        ("biClrImportant", c_ulong),
        ]

windll.user32.OpenClipboard(None)
hDIB = windll.user32.GetClipboardData(8)
bih = BITMAPINFOHEADER.from_address(hDIB)
print(bih.biSize)

And then python crashes instantly. I'm assuming I'm reading memory I shouldn't do in a really underhanded way, 'cause the way I was trying before was gentle enough such that I got an error message telling me to stop trying to read that memory. I'm following documentation I've hastily found on MSDN:

  • Overview

  • GetClipboardData

  • GetClipboardData types and

  • BITMAPINFOHEADER definition

If anyone knows more about this than me, I'd surely be glad for the help.

🌐
Readthedocs
ironpython-test.readthedocs.io › en › latest › library › ctypes.html
15.18. ctypes — A foreign function library for Python — IronPython 2.7.2b1 documentation
>>> null_ptr = POINTER(c_int)() >>> print bool(null_ptr) False >>> ctypes checks for NULL when dereferencing pointers (but dereferencing invalid non-NULL pointers would crash Python):
🌐
Python
bugs.python.org › issue41883
Issue 41883: ctypes pointee goes out of scope, then pointer in struct dangles and crashes - Python tracker
This issue tracker has been migrated to GitHub, and is currently read-only. For more information, see the GitHub FAQs in the Python's Developer Guide · This issue has been migrated to GitHub: https://github.com/python/cpython/issues/86049