2011-02-23 67 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實例。我強烈建議您在這裏重新考慮您的方法。