gpt4 book ai didi

python - 如何使用 ctypes 调用具有双下划线函数名的 DLL 函数?

转载 作者:行者123 更新时间:2023-12-04 08:26:34 24 4
gpt4 key购买 nike

我正在尝试使用带有 ctypes 的 Python 3.8 调用 DLL 中的函数。模块。
DLL 中的函数名是__apiJob() .注意,这个函数以双下划线开头。
我想在自定义对象中调用它,例如:

class Job:

def __init__(self,dll_path):
self.windll = ctypes.WinDLL(dll_path)

def execute(self):
self.windll.__apiJob()

a = Job('api64.dll')
a.execute()
但由于函数名以双下划线开头,在 Python 中以 mangling 函数命名,会被视为私有(private)方法。因此,在运行此脚本时, __apiJob将重命名为 _Job_apiJob这会导致错误: "_Job__apiJob" not found .
我该如何处理情况?

最佳答案

该函数也可以使用以下语法调用,并绕过 Python 应用于类实例的“dunder”属性的混淆:

self.windll['__apiJob']()
下面的例子:
测试.cpp
extern "C" __declspec(dllexport)
int __apiJob() {
return 123;
}
测试.py
import ctypes

class Job:

def __init__(self):
dll = ctypes.CDLL('./test')
self.apiJob = dll['__apiJob'] # bypass "dunder" class name mangling
self.apiJob.argtypes = ()
self.apiJob.restype = ctypes.c_int

def execute(self):
return self.apiJob()

a = Job()
result = a.execute()
print(result)
输出:
123
顺便说一句, WinDLL用于使用 __stdcall 声明函数的 DLL 32 位 DLL 中的调用约定。 CDLL用于默认 __cdecl调用约定。 64 位 DLL 只有一个调用约定,所以两者都可以,但为了可移植性,请记住这一点。

关于python - 如何使用 ctypes 调用具有双下划线函数名的 DLL 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65235119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com