簡體   English   中英

如何使用Python中的DLL

[英]How can I use a DLL from Python

我正在嘗試在Python中加載DLL,我想通過ctypes使用其eConnect()函數

我從DLL的源代碼了解到了什么:

  • 來自* .cpp源代碼: bool eConnect( const char *host, UINT port, int clientId=0);
  • 從依賴關系查詢工具中:函數序數為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 ++)。 謝謝!

為了使事情變得更輕松(更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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM