[英]How can I use a DLL from Python
我正在嘗試在Python中加載DLL,我想通過ctypes使用其eConnect()函數
我從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 ++)。 謝謝!
為了使事情變得更輕松(更Python化),您可能需要研究ctypesgen:
http://code.google.com/p/ctypesgen/
它將為您生成適當的包裝函數,數據類型等。 如果您只是想知道如何使用ctypes,不妨從本教程開始:
http://docs.python.org/library/ctypes.html
更具體的內容,我將不得不閱讀您嘗試使用的DLL的API。
導出的函數是EClientSocket
類的類成員函數。 您正在嘗試從Python調用該函數,而沒有傳入EClientSocket
指針作為this
參數。 此外,ctypes對__thiscall
調用約定__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
實例。 我強烈建議您在這里重新考慮您的方法。
考慮研究IronPython 。 這樣可以更輕松地調用DLL文件。
謝謝大家的回答。 我接受了亞當的勸告,並重新考慮了我的近況。 我不知道c ++,所以從一開始就不是一個好主意。
R中有一個替代API(非官方),它是在官方Java API之上構建的。 然后使用rPy2鏈接R和Python很容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.