使用ctypes返回值 我正在研究从Python调用C++代码。我刚刚了解了ctypes,并在web上看到了一些示例。我试图调用一个看起来像下面的C++函数: get_数据(re*data_记录,char*string) 没有关于C++的线索,我要问一些基本知识。我应该如何使用ctypes从python调用这样一个函数。 我决定退一步,因为我觉得我缺少一些基本的东西 实际上对于任何类型的C++函数,它都使用字符串类型的参数并返回一个整数,参见一些例子 结构数据库对象{ char db_名称[50], int_32 db_guid, char db_路径[100]; }; 获取数据库运行状态(db*db\u obj,int\u 8 db\u id,int\u 8*retvalue); 获取数据库运行状态字符串(db*db\u obj,int\u 8db\u id,char*retvalue);

使用ctypes返回值 我正在研究从Python调用C++代码。我刚刚了解了ctypes,并在web上看到了一些示例。我试图调用一个看起来像下面的C++函数: get_数据(re*data_记录,char*string) 没有关于C++的线索,我要问一些基本知识。我应该如何使用ctypes从python调用这样一个函数。 我决定退一步,因为我觉得我缺少一些基本的东西 实际上对于任何类型的C++函数,它都使用字符串类型的参数并返回一个整数,参见一些例子 结构数据库对象{ char db_名称[50], int_32 db_guid, char db_路径[100]; }; 获取数据库运行状态(db*db\u obj,int\u 8 db\u id,int\u 8*retvalue); 获取数据库运行状态字符串(db*db\u obj,int\u 8db\u id,char*retvalue);,python,c++,python-2.7,ctypes,Python,C++,Python 2.7,Ctypes,此函数将返回一个状态值(retvalue),我可以对其进行解码以了解数据库的状态,例如10=正常运行、11=中断、12=暂停、404=故障等 get_database_running_status_字符串将返回字符串,而不仅仅是数字 我该怎么称呼这些人呢?我不知道那个*符号是什么意思,但我希望它能有所帮助 也许我知道如何正确地从Python调用C++函数,那么我的问题就可以解决了。 < P>发布一个C++代码的实际例子会有帮助,但是我只需要创建一个类似于演示的东西。 这里是简单的C++ DLL源

此函数将返回一个状态值(retvalue),我可以对其进行解码以了解数据库的状态,例如10=正常运行、11=中断、12=暂停、404=故障等

get_database_running_status_字符串将返回字符串,而不仅仅是数字

我该怎么称呼这些人呢?我不知道那个*符号是什么意思,但我希望它能有所帮助


也许我知道如何正确地从Python调用C++函数,那么我的问题就可以解决了。

< P>发布一个C++代码的实际例子会有帮助,但是我只需要创建一个类似于演示的东西。

这里是简单的C++ DLL源程序。因为代码> cType < /Cuff> C函数,而不是C++,函数被声明为代码>外“C”<代码>正常工作。我在Windows上执行此操作,因此使用

\uu declspec(dllexport)
将函数标记为从DLL导出:

#include <stdio.h>

struct record {
    int x,y;
};

typedef int int_32;
typedef char int_8;

struct db_obj {
    char db_name[50];
    int_32 db_guid;
    char db_path[100];
};

extern "C" {
    __declspec(dllexport) void get_data_int(record* pRec, int* pResult) {
        *pResult = pRec->x + pRec->y;
    };
    __declspec(dllexport) void get_data_string(record* pRec, char* pResult, size_t size) {
        sprintf_s(pResult,size,"%d + %d = %d\n", pRec->x, pRec->y, pRec->x + pRec->y);
    }
    __declspec(dllexport) void get_database_running_status(db_obj* db, int_8 db_id, int_8 *retvalue) {
        printf("db_name = %s\ndb_guid = %d\ndb_path = %s\ndb_id = %d\n", db->db_name, db->db_guid, db->db_path, db_id);
        *retvalue = 42;
    }
}
输出:

12
5 + 7 = 12

db_name = database name
db_guid = 1234
db_path = database path
db_id = 7
42

参见详细文档。

发布工作C++代码的实际示例将有所帮助,但我只需创建类似于演示的类似内容。

这里是简单的C++ DLL源程序。因为代码> cType < /Cuff> C函数,而不是C++,函数被声明为代码>外“C”<代码>正常工作。我在Windows上执行此操作,因此使用

\uu declspec(dllexport)
将函数标记为从DLL导出:

#include <stdio.h>

struct record {
    int x,y;
};

typedef int int_32;
typedef char int_8;

struct db_obj {
    char db_name[50];
    int_32 db_guid;
    char db_path[100];
};

extern "C" {
    __declspec(dllexport) void get_data_int(record* pRec, int* pResult) {
        *pResult = pRec->x + pRec->y;
    };
    __declspec(dllexport) void get_data_string(record* pRec, char* pResult, size_t size) {
        sprintf_s(pResult,size,"%d + %d = %d\n", pRec->x, pRec->y, pRec->x + pRec->y);
    }
    __declspec(dllexport) void get_database_running_status(db_obj* db, int_8 db_id, int_8 *retvalue) {
        printf("db_name = %s\ndb_guid = %d\ndb_path = %s\ndb_id = %d\n", db->db_name, db->db_guid, db->db_path, db_id);
        *retvalue = 42;
    }
}
输出:

12
5 + 7 = 12

db_name = database name
db_guid = 1234
db_path = database path
db_id = 7
42

有关详细信息,请参阅文档。

如何调用该函数?(请包括代码-我也对函数参数感兴趣)。你试过用c程序调用它吗?您还尝试过简化问题(例如,调用一个func,不带参数,只返回一个
char*
),然后从python调用它(
restype
在这种情况下有效)。您如何调用该函数?(请包括代码-我也对函数参数感兴趣)。你试过用c程序调用它吗?您还尝试过简化问题(例如,调用一个func,不带参数,只返回一个
char*
),然后从python调用它(
restype
在这种情况下有效)。谢谢。我试图添加一个更真实的代码示例,请参见更新的问题。我仍然不清楚如何将字符串传递到函数中,我看到argtypes c.POINTER(c.c_char),但是如何将“hello world”作为输入参数传递?这是否意味着当c函数有*时,这意味着python argtypes必须有ctypes.POINTER(适当的ctypes)?@user595985,对于输入字符串,使用
c\u char\p
并传递输入字符串。对于输出字符串,使用
指针(c_char)
,使用
create_string_buffer
分配内存来保存字符串,并传递缓冲区。C++定义中的指示一个值的指针,这就是为什么我使用<代码>指针< />代码。请注意,输入字符串的
c\u char\p
已经是一个指针,不需要包装在
指针中。我觉得你不懂C/C++?这将使使用
ctypes
:)很困难。谢谢你,你最后的评论和例子真的帮了我。你说得很对,我不懂C/C++,这是我第一次以任何有意义的方式与C进行交互。类型..谁需要它们(只是开玩笑)。谢谢你,谢谢。我试图添加一个更真实的代码示例,请参见更新的问题。我仍然不清楚如何将字符串传递到函数中,我看到argtypes c.POINTER(c.c_char),但是如何将“hello world”作为输入参数传递?这是否意味着当c函数有*时,这意味着python argtypes必须有ctypes.POINTER(适当的ctypes)?@user595985,对于输入字符串,使用
c\u char\p
并传递输入字符串。对于输出字符串,使用
指针(c_char)
,使用
create_string_buffer
分配内存来保存字符串,并传递缓冲区。C++定义中的指示一个值的指针,这就是为什么我使用<代码>指针< />代码。请注意,输入字符串的
c\u char\p
已经是一个指针,不需要包装在
指针中。我觉得你不懂C/C++?这将使使用
ctypes
:)很困难。谢谢你,你最后的评论和例子真的帮了我。你说得很对,我不懂C/C++,这是我第一次以任何有意义的方式与C进行交互。类型..谁需要它们(只是开玩笑)。非常感谢。