1

I have a dll with a function that takes PyObject as argument something like

void MyFunction(PyObject* obj)
{
    PyObject *func, *res, *test;

    //function getAddress of python object
    func = PyObject_GetAttrString(obj, "getAddress");

    res = PyObject_CallFunction(func, NULL);
    cout << "Address: " << PyString_AsString( PyObject_Str(res) ) << endl;
}

and I want to call this function in the dll from python using ctypes

My python code looks like

import ctypes as c

path = "h:\libTest"
libTest = c.cdll.LoadLibrary( path )

class MyClass:
    @classmethod
    def getAddress(cls):
        return "Some Address"

prototype = c.CFUNCTYPE(    
    c.c_char_p,                
    c.py_object
)

func = prototype(('MyFunction', libTest))

pyobj = c.py_object(MyClass)
func( c.byref(pyobj) )

there is some problem in my Python code when I run this code I got message like

WindowsError: exception: access violation reading 0x00000020

Any suggestion to improve python code would be appriciated.

3
  • I suppose PyObject_GetAttrString(Class, "getAddress") is really PyObject_GetAttrString(obj, "getAddress")? I also suppose that you check every function result, and none of them is a null up until cout <<? Commented Jun 26, 2012 at 20:01
  • Yes Its a typo. Thanks. I'll fix it. Apart from that the C code is fine. I am having trouble with the python part. Passing pointer to the python objects from Python to that c function. How ? Commented Jun 26, 2012 at 20:29
  • Hmm, I don't know for real, but I think byref is not needed here. I suppose that just func(pyobj) should work. With byref the C code gets a pointer to a pointer. Commented Jun 26, 2012 at 20:42

1 Answer 1

4

I made the following changes to your code and it worked for me, but I'm not sure it is 100% correct way to do it:

  1. Use PYFUNCTYPE.
  2. Just pass the python class object.

For example:

prototype = c.PYFUNCTYPE(    
    c.c_char_p,                
    c.py_object
)

func = prototype(('MyFunction', libTest))

func( MyClass )
Sign up to request clarification or add additional context in comments.

2 Comments

Yes It worked for me too, Thanks. But could you please explain whats the difference between c.PYFUNCTYPE and c.CFUNCTYPE. How would I know which one to choose ?
I couldn't find much in the documentation, other than it doesn't release the GIL (global interpreter lock). Since your DLL was using the Python API and passing python objects, it seemed a good choice.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.