Python and ctypes: how to correctly pass “pointer-to-pointer” into DLL?

前端 未结 1 1410
面向向阳花
面向向阳花 2020-12-05 00:26

I have a DLL that allocates memory and returns it. Function in DLL is like this:

void Foo( unsigned char** ppMem, int* pSize )
{
  * pSize = 4;
  * ppMem = m         


        
相关标签:
1条回答
  • 2020-12-05 01:16

    Post actual code. The C/C++ code doesn't compile as either C or C++. The Python code has syntax errors (] ending function call Foo). The code below works. The main issue after fixing syntax and compiler errors was declaring the function __stdcall so windll could be used in the Python code. The other option is to use __cdecl (normally the default) and use cdll instead of windll in the Python code.

    mydll.c (cl /W4 /LD mydll.c)

    #include <stdlib.h>
    
    __declspec(dllexport) void __stdcall Foo(unsigned char** ppMem, int* pSize)
    {
        char i;
        *pSize = 4;
        *ppMem = malloc(*pSize);
        for(i = 0; i < *pSize; i++)
            (*ppMem)[i] = i;
    }
    

    demo.py

    from ctypes import *
    Foo = windll.mydll.Foo
    Foo.argtypes = [POINTER(POINTER(c_ubyte)),POINTER(c_int)]
    mem = POINTER(c_ubyte)()
    size = c_int(0)
    Foo(byref(mem),byref(size))
    print size.value,mem[0],mem[1],mem[2],mem[3]
    

    Output

    4 0 1 2 3
    
    0 讨论(0)
提交回复
热议问题