如何使用Python中的DLL

2024-06-29 00:43:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python加载DLL,我想使用它的eConnect()函数使用ctypes

从DLL的源代码中我知道:

  • 从*.cpp源代码:bool eConnect( const char *host, UINT port, int clientId=0);
  • 从dependency walker工具:函数序号是6,未修饰的名称是
    ?eConnect@EClientSocket@@UAE_NPBDIH@Z

我试图从myfunction和myfunction2两种方式访问eConnect,但我可能弄错了。这是我的代码:

from ctypes import *

def main():

IP = c_char_p('127.0.0.1')
port = c_uint(7496)
client_id = c_int(0)

myfunction = getattr(cdll.TwsSocketClient, "?eConnect@EClientSocket@@UAE_NPBDIH@Z")
myfunction2= cdll.TwsSocketClient[6]

print myfunction
print myfunction2

print myfunction(IP, port, client_id,IP)

if __name__ == "__main__":
main()

我得到以下错误:

“WindowsError:异常:读取0x0000002D时发生访问冲突”

我在这里非常需要帮助(我不懂c++)。 谢谢!在


Tags: 函数ip源代码mainportctypesintdll
3条回答

考虑查看IronPython。它使调用DLL文件更容易。在

为了让事情更简单,更像Python,你可能想看看ctypesgen:

http://code.google.com/p/ctypesgen/

它将为您生成适当的包装函数、数据类型等。如果只想知道如何使用ctypes,不妨从教程开始:

http://docs.python.org/library/ctypes.html

任何更具体的,我将不得不阅读你试图使用的DLL的API。在

要导出的函数是类EClientSocket的类成员函数。您试图从Python调用该函数,而不将EClientSocket指针作为this参数传入;此外,ctypes对__thiscall调用约定一无所知,因此即使您确实传入了EClientSocket实例,它也将在堆栈中而不是在ECX寄存器中。在

唯一真正的解决方案是从DLL导出一个C包装器,它将调用转发到eConnect。例如:

extern "C" DLLEXPORT
bool EClientSocket_eConnect(EClientSocket *This, const char *host, UINT port, int clientId)
{
    return This->eConnect(host, port, clientId);
}

但是,即使在这种情况下,您也必须在Python端特别小心地构造一个适当的EClientSocket实例。我强烈建议你重新考虑一下你的做法。在

相关问题 更多 >