我试图用Python加载DLL,我想使用它的eConnect()函数使用ctypes
从DLL的源代码中我知道:
bool eConnect( const char *host, UINT port, int clientId=0);
?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++)。 谢谢!在
考虑查看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
。例如:但是,即使在这种情况下,您也必须在Python端特别小心地构造一个适当的
EClientSocket
实例。我强烈建议你重新考虑一下你的做法。在相关问题 更多 >
编程相关推荐