加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何在ctypes中传回指针?

发布时间:2020-12-14 04:11:35 所属栏目:Windows 来源:网络整理
导读:对ctypes不太了解,最近刚开始使用它. 我在C-like dll中有一个简单的函数,它返回一个指向动态生成的字符串的指针. 它工作正常,但是,因为我手动为字符串分配内存,我应该在使用后释放它. 我有这样的事情: extern "C" char* DLL_EXPORT func(const char* str1,c
对ctypes不太了解,最近刚开始使用它.

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

我有这样的事情:

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中删除?

你走在正确的轨道上.
// 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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读