如何使用没有输入参数的ctypes调用函数?

2024-10-04 11:31:43 发布

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

我试图用CyType调用Python中的C++函数AddithTooUu。函数AddithTooUu在C++头文件中定义为:

extern ExternalInputs_add_two add_two_U;

结构ExternalInputs_add_two在头文件中定义为:

^{pr2}$

我在下面的Python代码中调用的add_two_initialize函数在头文件中定义为:

extern void add_two_initialize(boolean_T firstTime);

我的Python代码:

import sys
from ctypes import *

class ModelInput(Structure):
    _fields_ = [("Input", c_int),
                ("Input1", c_int)]

#define the functions    
initiateModel = cdll.add_two_win32.add_two_initialize
U_Model = cdll.add_two_win32.add_two_U


# define the pointers to the functions
initiateModel.restype = c_void_p
U_Model.restype = c_void_p

#initialize the model with value of 1
print "\n\nInitialize"
errMsg = initiateModel(1)
print "initateModel reports:", errMsg

#Initialize the structure and get the pointer.
test_input = ModelInput(1,2)
input_ptr =  pointer(test_input)

我试图在python代码中通过变量U_\U模型调用函数add_2;two_。注意,在头文件中,这个函数没有任何输入参数,而是使用头文件中的结构来获取输入数据。在

我有以下两个问题:

  1. 我如何在Python代码中设置ExternalInputs_add_two结构来将数据传递给add_two_U函数?

  2. 我如何在没有参数的情况下调用dll函数add_two_U,而我在Python代码中通过U_Model引用它?如果我使用Python语句调用函数:

    result = U_Model()
    

    我得到以下错误:

    WindowsError: exception: access violation reading 0xFFFFFFFF
    

我在网上搜索答案,但找不到初始化头文件中的结构并调用无参数函数的示例。在

请注意,在我的Python代码中,我可以通过initiateModel调用函数add_two_initialize而不会出错,因为这个函数有输入参数。在


Tags: the函数代码addinput参数model定义
2条回答

add_two_U不是函数,它是导出的值。您需要使用in_dll。在

Accessing values exported from dlls。在

大卫

谢谢你回答我的第一个问题。我将Python代码改为:

#Comment out this line.  add_two_U is not a function
#U_Model = cdll.add_two_win32.add_two_U

#Get the output pointer from add_two_U
output = POINTER(ModelInput)
results = output.in_dll(cdll.add_two_win32,"add_two_U")

print "got results", results.contents()

这个代码有效。我仍然无法找到第一个问题的答案:如何在Python代码的头文件中设置initialize the structure ExternalInputs_add_two。在

我已经搜索了ctypes文档,但找不到关于如何实现这一点的函数或示例。我知道可能在文件里。在

相关问题 更多 >