).

исал библиотеку dll на c, скомпилировал с vs2017 64-bit и попытался загрузить ее с python3.6 64-bit. Однако адрес переменной-члена объекта был усечен до 32-разрядного.

Вот мой файл sim.c, который скомпилирован в sim.dll:

class Detector {
public:
    Detector();
    void process(int* pin, int* pout, int n);

private:
    int member_var;
};

Detector::Detector()
{
    memset(&member_var, 0, sizeof(member_var));
    myfile.open("addr_debug.txt");
    myfile << "member_var init address: " << &member_var << endl;
}
void Detector::process(int* pin, int* pout, int n);
{
    myfile << "member_var process address: " << &member_var << endl;
    myfile.close();
}

#define DllExport   __declspec( dllexport )  

extern "C" {
    DllExport Detector* Detector_new() { return new Detector(); }
    DllExport void Detector_process(Detector* det, int* pin, int* pout, int n)
    {
        det->process(pin, pout, n);
    }
}

Вот мой скрипт на python:

from ctypes import cdll
lib = cdll.LoadLibrary(r'sim.dll')

class Detector(object):
    def __init__(self):
        self.obj = lib.Detector_new()

    def process(self,pin, pout, n):
        lib.Detector_process(self.obj,pin, pout, n)

detector = Detector()

n = 1024
a = np.arange(n, dtype=np.uint32)
b = np.zeros(n, dtype=np.int32)

aptr = a.ctypes.data_as(ctypes.POINTER(ctypes.c_int))
bptr = b.ctypes.data_as(ctypes.POINTER(ctypes.c_int))

detector.process(aptr, bptr, n)

Вот адрес member_var в addr_debug.txt:

member_var init address:    0000025259E123C4
member_var process address: 0000000059E123C4

Так что доступ к нему вызывает ошибку доступа к памяти:

OSError: exception: access violation reading 0000000059E123C4

Несколько попыток, которые я пытался понять, проблема:

Определите member_var как публичный, а не частный, а не справочный, адрес все еще урезан.Определите member_var как глобальную переменную, тогда адрес в порядке. Поэтому я предполагаю, что усечение адреса member_var происходит либо при возврате объекта в python, либо при передаче объекта обратно в dll.

Ответы на вопрос(1)

Ваш ответ на вопрос