我的C ++ DLL函数遇到了这个问题。我的C ++ DLL函数描述如下:
// Combine the lower 32 bits and upper 8 bits of a 40 bit
// integer into a 64 bit double precision floating point number
//
// Inputs:
// - Lower: lower 32 bits of the 40 bit timestamp
// - Upper: upper 8 bits of the 40 bit timestamp
//
// Outputs:
// - function return value is the 64 bit double precision floating point number
//
extern "C" double WINAPI Make64BitDoubleIntegerFromUpperLower(uint32_t Lower, uint8_t Upper);
当我创建一个简单的C ++客户端测试代码时,该函数可以工作,我得到了我期望的结果。我试图创建一个将使用此功能(和其他人)的python客户端。我已经设置了在python中运行函数所需的一切(库,导入位置等),并且我输入了正确的参数,但是当我为我的python客户端运行测试代码脚本时,我总是得到一个值函数后为0。我发现python函数返回的是Int而不是c_double。我在线查看,发现有一种方法可以使用' restype'功能。我这样使用它:
def pc_make_64_bit_double_integer_from_upper_lower(self, Lower, Upper):
self.opxclient_dll.OPX_Make64BitDoubleIntegerFromUpperLower.restype = c_double
return self.opxclient_dll.OPX_Make64BitDoubleIntegerFromUpperLower(Lower, Upper)
现在一切正常,我得到了正确的输出。这很好,但我也很困惑这是如何工作的。我担心的是我有很多我想在我的python客户端实现的DLL函数。大多数只是填充我通过引用传入的数组,使用c_long和c_int值,我将转换为python类型。然后这些函数返回0(获取数据)或-1(无数据),python很容易读取为int。我什么时候应该使用restype功能?是否有必要为所有dll函数获取正确的输出值?
非常感谢您的帮助。谢谢!
答案 0 :(得分:1)
就像任何C函数一样,Python需要知道返回类型是什么,以便将其转换为自己的类型。 默认情况下,python推断返回类型是一个int - 事情并非总是如此。
在所有情况下,当返回类型不是int时,您需要显式声明函数的返回类型,以便python将正确转换并转换它。