extracting null pointer address from PyCObject with ctypes
Aaron "Castironpi" Brady
castironpi at gmail.com
Fri Oct 10 22:43:20 EDT 2008
On Oct 10, 7:59 pm, Gordon Allott <gordall... at gmail.com> wrote:
> Aaron "Castironpi" Brady wrote:
> > Yes, well said. But no, not true, not necessarily. You can choose/
> > change return types with your code. If the call is defined already
> > and you can't change the return, just define a new one that returns
> > long.
> > --
> >http://mail.python.org/mailman/listinfo/python-list
>
> the problem is that the pointer or long or whatever it is thats returned
> won't be the data I am after. the code for PyCObject_FromVoidPtr is as
> follows:
>
> PyObject *
> PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *))
> {
> PyCObject *self;
>
> self = PyObject_NEW(PyCObject, &PyCObject_Type);
> if (self == NULL)
> return NULL;
> self->cobject=cobj;
> self->destructor=destr;
> self->desc=NULL;
>
> return (PyObject *)self;
>
> }
>
> it obviously creates a new PyObject and returns that, which has already
> happened once (the address I am after is passed to python via
> PyCObject_FromVoidPtr(adress_i_am_after, NULL), doing that puts the
> address I am after into the .cobject attribute of a new pyobject
> structure and passes that to the python script via the 'display' key in
> a dictionary.
>
> If I were to then take the pycobject in this display key and pass it via
> ctypes into PyCObject_FromVoidPtr it would simply create a new pycobject
> and put a pointer to the old pycobject in the new pycobject's .cobject
> attribute. it just means that I am getting further and further away from
> where I want to be surely? if I were to take the current pointer at this
> stage, to get to the address I actually want in C it would have to
> follow something along the lines of
> long address_i_want = (long)(new_pycobj->cobject->cobject);
>
> What would be great is if there is some easy simple way of accessing the
> .cobject attribute of the first pycobject thats passed via the
> dictionary to python.
>
> --
> Gord Allott (gordall... at gmail.com)
>
> signature.asc
> < 1KViewDownload
You are hard to follow. There is the 'cast' function, which I've had
some success with, even in adding pointers and offsets. It took a
look at the code for it though, and calling an undocumented version of
it. I can post that later if you don't have luck the same. You can
write extension modules to do that as well, and there's always a
Google search which personally I forget half the time too. Last, you
haven't mentioned an attempt with PyCObject_AsVoidPtr yet:
void* PyCObject_AsVoidPtr(PyObject* self)
Return the object void * that the PyCObject self was created with.
Where does that get you?
More information about the Python-list
mailing list