2010-11-19 62 views
3

Pythonからdllに呼び出しをしようとしていますが、アクセス違反が発生しています。次のコードでctypesを正しく使用する方法を教えてください。想定しているのgetItemsは、他のフィールドを必要としない、私はIDを得ることに本当に唯一興味がこのPythonでDLLから関数を呼び出す

struct ITEM 
{ 
unsigned short id; 
unsigned char i; 
unsigned int c; 
unsigned int f; 
unsigned int p; 
unsigned short e; 
}; 

のように見える構造体を返します。私のコードは以下の通りですが、何が間違っていますか?助けてくれてありがとう。

import psutil 
from ctypes import * 

def _get_pid(): 
    pid = -1 

    for p in psutil.process_iter(): 
     if p.name == 'myApp.exe': 
      return p.pid 

    return pid 


class MyDLL(object): 
    def __init__(self): 
     self._dll = cdll.LoadLibrary('MYDLL.dll') 
     self.instance = self._dll.CreateInstance(_get_pid()) 

    @property 
    def access(self): 
     return self._dll.Access(self.instance) 

    def get_inventory_item(self, index): 
     return self._dll.GetItem(self.instance, index) 


if __name__ == '__main__': 

    myDLL = MyDLL() 
    myDll.get_item(5) 

答えて

0

まず第一に、あなたのクラスは唯一get_inventory_itemが定義されている間、あなたは、get_itemを呼んでいる、とあなたは結果を破棄している、とMYDLLの総額が矛盾しています。あなたはこのように、あなたの構造体のctypes型を定義する必要が

class ITEM(ctypes.Structure): 
    _fields_ = [("id", c_ushort), 
       ("i", c_uchar), 
       ("c", c_uint), 
       ("f", c_uint), 
       ("p", c_uint), 
       ("e", c_ushort)] 

http://docs.python.org/library/ctypes.html#structured-data-typesを参照)

次に、関数型はITEMであることを指定します。

myDLL.get_item.restype = ITEM 

http://docs.python.org/library/ctypes.html#return-typesを参照してください)

今あなたはablにすべきですeを呼び出すと、構造体のメンバーを持つオブジェクトが属性として返されます。

+0

これを追加して今すぐ取得しました AttributeError: 'instancemethod'オブジェクトに 'restype'属性がありません – poco

+0

カスタムクラスではなく、実際のDLL関数で 'restype'を設定する必要があります。あなたの場合: 'self._dll.get_item_restype = ITEM'をクラスのメソッドに入れてください。混乱させて申し訳ありません。 –

関連する問題