2011-02-23 64 views
0

我试图加载Python中的DLL,我想用使用其eConnect()函数ctypes如何使用一个DLL从Python的

我从DLL的源代码知道什么:

  • 从*的.cpp源代码:bool eConnect(const char *host, UINT port, int clientId=0);
  • 从依赖关系沃克工具:功能序是6和未修饰的名字是
    [email protected]@@[email protected]

我试图从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, "[email protected]@@[email protected]") 
myfunction2= cdll.TwsSocketClient[6] 

print myfunction 
print myfunction2 

print myfunction(IP, port, client_id,IP) 

if __name__ == "__main__": 
main() 

我得到下面的错误:

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

我迫切需要一些帮助在这里(我不知道C++) 。 谢谢!

+2

函数是从C++代码中导出为'stdcall'还是'cdecl'?另外,我会把它包装在一个'extern“C''中,这样你就不会得到那个令人反感的名字! – 2011-02-23 18:13:38

回答

0

感谢大家的回答。我接受了亚当的建议并重新考虑了我的接近。由于我不知道C++,从一开始就是一个糟糕的主意。

在R(非官方)中有一个替代API,它建立在官方Java API之上。使用rPy2连接R和Python非常容易。

4

为了让事情变得更容易,更Python,你可能想看看ctypesgen:

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

它会生成适当的包装函数,数据类型和这样的你。如果你只是想知道如何使用ctypes的,还不如与本教程开始:

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

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

+1

+1 ctypesgen?从来不知道存在,我做了很多ctypes。谢谢你的指导! – 2011-02-23 18:21:22

+0

是的,我们用它来为Subversion生成一个Python绑定。这真的很光滑。 – 2011-02-23 18:24:25

1

被导出是类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实例。我强烈建议您在这里重新考虑您的方法。