我无法理解如何从Python中的现有dll调用dll函数。
OTAClient = cdll.LoadLibrary("C:\PATH\OTAClient.dll")
connect = OTAClientDLL.TDConnection()
exceptions.AttributeError: function 'TDConnection' not found
我读了一些被编译器修改的名称。 有什么建议吗?
答案 0 :(得分:1)
DLL实际上是一个COM DLL。 comtypes需要使用这种类型的DLL而不是ctypes。 请务必download comtypes
from comtypes.client import CreateObject
OTAClientDLL = comtypes.client.GetModule("C:\PATH\OTAClient.dll")
答案 1 :(得分:0)
这可能是因为编译器破坏了函数名称。有两种方法可以解决这个问题:
阅读以下内容(来自http://docs.python.org/2/library/ctypes.html)
有时,dll导出的函数名称不是有效的Python标识符,例如“?? 2 @ YAPAXI @ Z”。在这种情况下,您必须使用getattr()来检索函数:
>>>
>>> getattr(cdll.msvcrt, "??2@YAPAXI@Z")
<_FuncPtr object at 0x...>
>>>
在Windows上,某些dll不按名称导出函数,而是按顺序导出函数。可以通过使用序号编号索引dll对象来访问这些函数:
>>>
>>> cdll.kernel32[1]
<_FuncPtr object at 0x...>
>>> cdll.kernel32[0]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "ctypes.py", line 310, in __getitem__
func = _StdcallFuncPtr(name, self)
AttributeError: function ordinal 0 not found
>>>
如果您不确定函数名称是什么,请查找link.exe dumpbin.exe。这些是在Visual Studio安装中找到的,它们会转储dll中可用的所有功能。您可以对结果运行grep。