在Python中调用DLL函数

在Python中调用DLL函数,python,dll,ctypes,Python,Dll,Ctypes,我很难理解如何从Python中现有的dll调用dll函数 OTAClient = cdll.LoadLibrary("C:\PATH\OTAClient.dll") connect = OTAClientDLL.TDConnection() 我读到一些东西,名字被编译器弄乱了。 有什么建议吗?这可能是因为编译器弄乱了函数名。解决这个问题有两种方法: 修复代码以告诉编译器不要损坏名称。(查找添加外部引用) 找到损坏的名称并从python中调用(请参见下面的描述) 阅读以下内容(摘自) 有时,D

我很难理解如何从Python中现有的dll调用dll函数

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

我读到一些东西,名字被编译器弄乱了。
有什么建议吗?

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

  • 修复代码以告诉编译器不要损坏名称。(查找添加外部引用)
  • 找到损坏的名称并从python中调用(请参见下面的描述)
  • 阅读以下内容(摘自)

    有时,DLL导出的函数的名称不是有效的Python标识符,如“”??2@YAPAXI@Z”。在这种情况下,必须使用getattr()检索函数:

    >>>
    >>> getattr(cdll.msvcrt, "??2@YAPAXI@Z") 
    <_FuncPtr object at 0x...>
    >>>
    
    >
    >>>getattr(cdll.msvcrt,“?”??2@YAPAXI@Z“)
    >>>
    
    在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
    >>>
    
    >
    >>>cdll.kernel32[1]
    >>>cdll.kernel32[0]
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,是否在中?
    文件“ctypes.py”,第310行,在__
    func=\u StdcallFuncPtr(名称,self)
    AttributeError:未找到函数序号0
    >>>
    

    如果不确定函数名可能是什么,请查找link.exe dumpbin.exe。这些都是在VisualStudio安装中找到的,它们转储dll中可用的所有函数。您可以对结果运行grep。

    该DLL实际上是一个COM DLL。 需要comtypes来使用这种类型的DLL而不是ctypes。 确保


    我以前查看过该文档,但没有帮助。
    >>>
    >>> 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
    >>>
    
    from comtypes.client import CreateObject
    
    OTAClientDLL = comtypes.client.GetModule("C:\PATH\OTAClient.dll")