在Python中调用DLL函数

时间:2013-08-01 16:21:28

标签: python dll ctypes

我无法理解如何从Python中的现有dll调用dll函数。

OTAClient = cdll.LoadLibrary("C:\PATH\OTAClient.dll")
connect = OTAClientDLL.TDConnection()

exceptions.AttributeError: function 'TDConnection' not found                

我读了一些被编译器修改的名称。 有什么建议吗?

2 个答案:

答案 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)

这可能是因为编译器破坏了函数名称。有两种方法可以解决这个问题:

  1. 修复代码,告诉编译器不要破坏名称。 (查找添加外部参考)
  2. 找到受损的名称并从python中调用它(参见下面的描述)
  3. 阅读以下内容(来自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。