3

Windowsのdll関数にアクセスするPythonスクリプトを作成します。dllとその機能にアクセスすることに成功しました。今、私はac機能を持っています

FIOSCR331_API int FIOCreateDeviceInfoList (PDEVINFO pDevInfoSet)

問題はPDEVINFO構造です。Pythonで構造を作成し、この構造にアクセスする必要があります。

C構造体は次のとおりです

typedef struct tagDEVINFO
{

    char                    szDeviceName[MAX_PATH];
    char                    szPCSCName[MAX_PATH];
    BOOL                    bPassedFilter;
    BOOL                    bUpdatePassed;
    DWORD                   dwUpdateOrder;
    DWORD                   dwPnP_ID;
    DWORD                   dwFWVersion;
    PDEVEXTENSION   pDevExtension;

} DEVINFO, *PDEVINFO;

C関数は次のとおりです

FIOSCR331_API int FIOCreateDeviceInfoList (PDEVINFO pDevInfoSet)
{

    int nFIOStatus;
    do
    {
            if ( NULL == pDevInfoSet )
            {
                printf("this is inside C code\n");
                    nFIOStatus = IDS_GENERIC_ERROR; //(200)
                    break;
            }
            else
                printf ("\n%s ",pDevInfoSet->szPCSCName);

    }while(false);
}

今私が実装したPythonコード

class DEVINFO(Structure):
    _fields_ = [("szDeviceName",c_char_p),
                ("szPCSCName",c_char_p),
                ("bPassedFilter",c_bool),
                ("bUpdatePassed",c_bool),
                ("dwUpdateOrder",c_ulong),
                ("dwPnp_ID",c_ulong),
                ("dwFWVersion",c_ulong),
                ("pDevExtention",DEVEXTENSION)]

lib = cdll.LoadLibrary('libFIOXXXXX.dll')
print (lib)
devInfo = DEVINFO()
devInfo.szPCSCName = c_char_p(b"this is test")
if devInfo is None:
    print("hi")
else:
    print("britto")
funcCreateList = lib.FIOCreateDeviceInfoList(devInfo)
print (funcCreateList)

私が得た結果は

britto
this is inside C code
200

問題は、コードが常にNULL状態になることです。つまり、devInfoはNULLです。何故ですか?

新しく追加されました

上記のPython構造体DEVINFOには、別の構造体DEVEXTENSIONが含まれています。DEVEXTENSIONエラーのメンバーにアクセスするにはどうすればよいですか?

print (devInfo.pDevExtension.szName)

これはスローします:

AttributeError: 'LP_DEVEXTENSION" object has no attribute szName
4

2 に答える 2

4

構造体の宣言が間違っています。そのはず:

class DEVINFO(Structure):
    _fields_ = [
        ("szDeviceName", c_char*wintypes.MAX_PATH),
        ("szPCSCName", c_char*wintypes.MAX_PATH),
        ("bPassedFilter", wintypes.BOOL),
        ("bUpdatePassed", wintypes.BOOL),
        ("dwUpdateOrder", wintypes.DWORD),
        ("dwPnp_ID", wintypes.DWORD),
        ("dwFWVersion", wintypes.DWORD),
        ("pDevExtension", POINTER(DEVEXTENSION))
    ]

DEVINFOまた、を呼び出すときに構造体へのポインタを渡す必要がありますFIOCreateDeviceInfoList()。私はこのようにします:

funcCreateList = lib.FIOCreateDeviceInfoList(byref(devInfo))

@eryksunが有益に指摘しているように、

lib.FIOCreateDeviceInfoList.argtypes = [POINTER(DEVINFO)]

を呼び出す前に、ランタイムタイプチェックを実行しますFIOCreateDeviceInfoList()ctypes

于 2012-10-27T16:03:21.367 に答える
0

次のように属性を設定して、引数の型がFIOCreateDeviceInfoListDEVINFO構造体へのポインターであることをctypesに通知します。argtypes

lib.FIOCreateDeviceInfoList.argtypes = [POINTER(DEVINFO)]
于 2012-10-27T15:56:30.747 に答える