用python调用DLL函数

2024-09-28 20:54:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我搜索了大约两天的方法来解决调用函数的问题:

int  HG_GetProgList  (sHG_ProgSlot** list) 

用python从DLL。sHG\u ProgSlot是一个结构:

typedef struct       //---- data set of a 'program slot' in the RDS-coder
{
    char strname [9];  
    int       slot;      
    int      bytes;                       
    int     groups; 
    int      times;    
    int  next_slot;  
} sHG_ProgSlot;

dll中函数的说明如下:

RDSHG81300B_API int __stdcall  HG_GetProgList  (sHG_ProgSlot** list);

//该DLL包含一个sHG\u ProgSlot数组,其中包含所有占用的“程序槽”。你知道吗

//条目按其插槽号升序排序。你知道吗

//此函数将指向此数组的指针复制到函数参数。你知道吗

//(使用HG\u GetNumberOfProgs()获取数组的长度。)

//输入:list-要设置的指针

//输出:0=无错误

我写了下面的代码:

class RDSCoderService(object):
    def GetProgramList(self, programList):
        getProgListFunction = self.RDS_Lib['HG_GetProgList]
        getProgListFunction.argtypes = [ctypes.POINTER(ctypes.POINTER(sHG_ProgSlot*60))]
        getProgListFunction.restype = ctypes.c_int
        return getProgListFunction(programList)

class sHG_ProgSlot(ctypes.Structure):
    _fields_ = [("strname", ctypes.c_char*9),
                ("slot", ctypes.c_int),
                ("bytes", ctypes.c_int),
                ("groups", ctypes.c_int),
                ("times", ctypes.c_int),
                ("next_slot", ctypes.c_int)]

函数调用:

rds=RDSCoderService()
struct_p=ctypes.POINTER(sHG_ProgSlot)  #pointer to a structure type
arr_of_struct_pointer=struct_p*60      #array of pointers to a struct type of size 60
instance_array=arr_of_struct_pointer() # instance array
p_inst_array=ctypes.pointer(instance_array)# pointer to array
Message=rds.GetProgramList(p_inst_array) #calling of function

谢谢你的帮助!你知道吗


Tags: of数组hgctypesarraystructlistint