0

PyObjectを引数として取る関数を含むdllがあります。

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

そして私はctypesを使用してPythonからdllでこの関数を呼び出したい

私のPythonコードは次のようになります

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

このコードを実行すると、Pythonコードに問題が発生し、次のようなメッセージが表示されます。

WindowsError:例外:0x00000020を読み取るアクセス違反

Pythonコードを改善するための提案はすべて適用されます。

4

1 に答える 1

3

私はあなたのコードに次の変更を加えました、そしてそれは私のために働きました、しかし私はそれがそれをする100%正しい方法であるかどうかわかりません:

  1. PYFUNCTYPEを使用します。
  2. Pythonクラスオブジェクトを渡すだけです。

例えば:

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

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

func( MyClass )
于 2012-06-27T01:41:12.180 に答える