如何在ctypes中传回指针?

2022-01-12 00:00:00 python dll ctypes pointers char

问题描述

对ctypes了解不多,最近才开始接触.

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

我在类 C 的 dll 中有一个简单的函数,它返回指向动态生成的字符串的指针.
它工作正常,但是因为我为字符串手动分配了内存,所以我应该在使用后释放它.

I have a simple function in C-like dll which returns a pointer to the dynamically generated string.
It is working fine, but, because i manually allocated memory for the string, i should free it after use.

我有这样的事情:

extern "C" char* DLL_EXPORT func(const char* str1, const char* str2)
{
    return getSomeString(str1, str2);
}

// Goal is to call this function correctly from Python.    
extern "C" void DLL_EXPORT freeMem(void *mem)
    {
        if(mem!=NULL)
            delete mem;
    }

但我不知道,如何将接收到的指针传回以在 Python 中删除?

But i don't have any idea, how can i pass received pointer back for deletion in Python?


解决方案

你在正确的轨道上.

// TestDLL.cpp
#include <string.h> // 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; 
}

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

相关文章