How to pass pointer back in ctypes?

后端 未结 2 1534
花落未央
花落未央 2020-12-29 13:02

Don\'t know much about ctypes, just recently began working with it.

I have a simple function in C-like dll which returns a pointer to the dynamically generated strin

2条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-29 13:43

    You're on the right track.

    // TestDLL.cpp
    #include  // strcpy
    
    extern "C" __declspec(dllexport) char* stringdup(const char* str) {
        char* p = new char[strlen(str)+1];
        strcpy(p,str);
        return p;
    }
    
    // if you have no good reason to use void*, use the type
    // you've allocated. while it usually works for built-in
    // types, it wouldn't work for classes (it wouldn't call
    // the destructor)
    extern "C" __declspec(dllexport) void stringfree(char* ptr) {
        // you don't need to check for 0 before you delete it,
        // but if you allocate with new[], free with delete[] !
        delete [] ptr; 
    }
    

    And in python:

    # Test.py
    import ctypes
    
    lib = ctypes.cdll.TestDLL
    
    # this creates a c-style char pointer, initialized with a string whose
    # memory is managed by PYTHON! do not attempt to free it through the DLL!
    cstr = ctypes.c_char_p("hello ctypes")
    
    # call the dll function that returns a char pointer 
    # whose memory is managed by the DLL.
    p = lib.stringdup(cstr)
    
    # p is just an integer containing the memory address of the 
    # char array. therefore, this just prints the address:
    print p
    
    # this prints the actual string
    print ctypes.c_char_p(p).value
    
    # free the memory through the DLL
    lib.stringfree(p)
    

提交回复
热议问题