我试图在我的代码中使用第三方DLL,并且我必须使用Python从该DLL调用函数. 根据文档,DLL只有4个函数,并且这些函数都不能从我的Python代码中调用. 我已经try 了x86和x64DLL(使用相应的Python发行版).我try 了Python3.7、3.9、3.10和3.11,所有这些都不能调用任何函数.

from ctypes import cdll
sdk = cdll.LoadLibrary("./Library.dll")
get_data = sdk.sdk_get_data
print(get_data)

这将返回一个错误:

  File "D:\sandbox\еуые.py", line 7, in <module>
    get_data = sdk.sdk_get_data
  File "C:\Python39-64\lib\ctypes\__init__.py", line 387, in __getattr__
    func = self.__getitem__(name)
  File "C:\Python39-64\lib\ctypes\__init__.py", line 392, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'sdk_get_data' not found

我使用了Lucasg的Dependencies工具来确保文档中的函数存在于DLL中,下面是输出:

1 (0x0001),  (0x), int __cdecl sdk_get_data(char * __ptr64,int,unsigned short * __ptr64,unsigned char * __ptr64), 0x00001b30, Microsoft

如何从此DLL调用函数?也许用C++编写包装器是必要的?

推荐答案

C ABI导出没有列出参数类型的信息,因此这表明该函数是C++函数.因为参数是与C兼容的,所以您可以使用C++修饰的函数名.使用Windows SDK dumpbin /exports工具时,它看起来像?sdk_get_data@@YAHPEADHPEAGPEAE@Z,但可能会因编译器而异.

例如,使用Microsoft编译器使用给定签名为test.cpp的C++编译函数:

__declspec(dllexport)
int __cdecl sdk_get_data(char* p, int n, unsigned short* w, unsigned char* data) {
    return 1;
}

下面将查找该函数:

import ctypes as ct
dll = ct.CDLL('./test')
func = dll['?sdk_get_data@@YAHPEADHPEAGPEAE@Z']
print(func())  # outputs 1

但是,如果您使用导出的C函数将参数转发到C++函数并将其链接到您的第三方DLL,则您的原始代码应该可以在没有修饰名称的情况下运行:

extern "C" __declspec(dllexport)
int sdk_get_data_c(char* p, int n, unsigned short w, unsigned char* data) {
    return sdk_get_data(p, n, w, data);
}

Python相关问答推荐

如何通过多2多字段过滤查询集

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

Pythind 11无法弄清楚如何访问tuple元素

沿着数组中的轴计算真实条目

使用索引列表列表对列进行切片并获取行方向的向量长度

如何创建一个缓冲区周围的一行与manim?

Odoo 16使用NTFS使字段只读

python中的解释会在后台调用函数吗?

在pandas数据框中计算相对体积比指标,并添加指标值作为新列

使用Python查找、替换和调整PDF中的图像'

如何检测鼠标/键盘的空闲时间,而不是其他输入设备?

Pandas:填充行并删除重复项,但保留不同的值

在numpy数组中寻找楼梯状 struct

当输入是字典时,`pandas. concat`如何工作?

如何为需要初始化的具体类实现依赖反转和接口分离?

PYTHON中的pd.wide_to_long比较慢

如何在Pandas中用迭代器求一个序列的平均值?

仅取消堆叠最后三列

极点:在固定点扩展窗口

来自任务调度程序的作为系统的Python文件