Python和WinDLL调用不会从DLL返回

2024-09-30 12:11:51 发布

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

My DLL具有以下功能:

extern "C" __declspec(dllexport) bool __cdecl  PcapOpen(unsigned long inSize, void * inData, unsigned long *outSize, void * outData, Function_Modes eMode)

函数将通过outSize和outData写出数据(这意味着需要将这些数据传递给函数,期望我在DLL中的函数会修改它们)

此外,功能模式是:

typedef enum Function_Modes { Mode_Unknown = -1, Mode_Preview = 0, Mode_Execute = 1, Mode_Query } Function_Modes;

为了在Perl中进行引用,我引用了如下函数:

my %Data;
$Data{Interface} = $interface;
my ($inData, $inSize) = buildData(\%Data);
$$outSize = pack("L", 65536);

$outData = "\x00"x65536;

my $pPcapOpen = Win32::API->new($dllName, "PcapOpen", "NPPPI", "I", "_cdecl");
my $return = $pPcapOpen->Call($inSize, $inData, $$outSize, $outData, $eMode);

我创建了一个小的Python代码,它应该运行函数并显示它返回的数据,但是“似乎要访问DLL”时的调用不会返回(调用之后的Python代码从未被调用)

pPcapDLL = ctypes.WinDLL("Pcap Interface.dll")

LP_c_char = ctypes.POINTER(ctypes.create_string_buffer(65536).__class__)                                                                                                  
obuf = ctypes.create_string_buffer(65536)
obuflen = ctypes.c_ulong(65536)
optr = LP_c_char(obuf)

PcapOpen = pPcapDLL["PcapOpen"]
PcapOpen.restype = ctypes.c_bool
PcapOpen.argtypes = [ctypes.c_ulong, ctypes.c_void_p, ctypes.POINTER(LP_c_char), ctypes.POINTER(ctypes.c_size_t), ctypes.c_int]

outSize = ctypes.c_ulong(65536)

LP_c_char = ctypes.POINTER(ctypes.create_string_buffer(65536).__class__)                                                                                                  
outData = ctypes.create_string_buffer(65536)
outData_ptr = LP_c_char(outData)

print("Calling PcapClose")
returnValue = PcapClose(inSize, inData, ctypes.byref(outSize), ctypes.byref(outData_ptr), eMode)

print("returnValue: {}".format(returnValue)) # <-- This doesn't get called

关于如何处理返回数据的DLL函数的文档似乎很少——只是应该使用byref,但是如何为这些函数分配数据以使用它们还不是100%清楚——所以这可能是我的问题

谢谢你的帮助。你知道吗


Tags: 数据函数modemycreatectypesdlllp
1条回答
网友
1楼 · 发布于 2024-09-30 12:11:51

在我看来,你需要做两个改变:

  1. 您试图调用的C函数使用cdecl调用约定,因此必须使用ctypes.cdll而不是ctypes.windll访问DLL。ctypes.windll用于stdcall调用约定。另见Python ^{} documentation

  2. 函数的第四个参数是指针,但您似乎在将指针传递给指针。尝试用ctypes.byref(outdata)替换ctypes.byref(outdata_ptr)

相关问题 更多 >

    热门问题