Python - ctypes - доступ к буферу возврата в виде указателя в библиотеке dll - SDK перевода данных - PullRequest
0 голосов
/ 14 сентября 2018

Я работаю над проектом с использованием DataAcq SDK Datatranlation.

Я пытаюсь получить доступ к буферу и установить его значения.

пример того, как это используется в C:

/* allocate the output buffer, sets handler for buffer */
CHECKERROR (olDmCallocBuffer(0,0,(ULNG) size,2,&hbuf));
/* Get pointer to buffer */
CHECKERROR (olDmGetBufferPtr(board.hbuf,(LPVOID*)&lpbuf));

/* fill the output buffer*/

lpbuf[i] = (UINT) some value

/* Put the buffer to the DAC */

CHECKERROR (olDaPutBuffer(board.hdass, hbuf));

Я пытаюсь сделать то же самое в Python, используя ctypes:

_buffer = ctypes.c_void_p()

    # Create buffer:
    check_error(memlib.olDmCallocBuffer(ctypes.c_uint(0x0000),
                                        ctypes.c_uint(0x0000),
                                        ctypes.c_uint(2),
                                        ctypes.c_uint(4),
                                        ctypes.byref(_buffer)))
    # Get pointer to buffer:
    buf_ptr = ctypes.c_void_p()
    check_error(memlib.olDmGetBufferPtr(_buffer, ctypes.byref(buf_ptr)))

Но как я могу получить доступ и установить элементы, как в примере на C выше? Я могу сделать ссылку в Python, которую я могу изменить, но как разобрать это обратно в функцию olDaPutBuffer?

Edit:

Решено с помощью memmove из ctypes:

_buffer = ctypes.c_void_p()

# Create buffer:
check_error(memlib.olDmCallocBuffer(ctypes.c_uint(0x0000),
                                    ctypes.c_uint(0x0000),
                                    ctypes.c_uint(2),
                                    ctypes.c_uint(4),
                                    ctypes.byref(_buffer)))
# Get pointer to buffer:
buf_ptr = ctypes.c_void_p()
check_error(memlib.olDmGetBufferPtr(_buffer, ctypes.byref(buf_ptr)))

c_type_buf = ctypes.c_buffer(some values)
ctypes.memmove(buf_ptr, ctypes.byref(c_type_buf), len(c_type_buf))

1 Ответ

0 голосов
/ 18 сентября 2018

Решено с memmove из ctypes:

_buffer = ctypes.c_void_p()

# Create buffer:
check_error(memlib.olDmCallocBuffer(ctypes.c_uint(0x0000),
                                    ctypes.c_uint(0x0000),
                                    ctypes.c_uint(2),
                                    ctypes.c_uint(4),
                                    ctypes.byref(_buffer)))
# Get pointer to buffer:
buf_ptr = ctypes.c_void_p()
check_error(memlib.olDmGetBufferPtr(_buffer, ctypes.byref(buf_ptr)))

# Create new buffer
c_type_buf = ctypes.c_buffer(some values)

# Copy new buffer to address of the original buffer
ctypes.memmove(buf_ptr, ctypes.byref(c_type_buf), len(c_type_buf))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...