2011-08-10 140 views
1

在DLL中我有以下結構使用Python ctypes的dll的工作 - 結構OUT參數

typedef struct USMC_Devices_st{ 
DWORD NOD;   // Number of the devices ready to work 

char **Serial;  // Array of 16 byte ASCII strings 
char **Version;  // Array of 4 byte ASCII strings 
} USMC_Devices;   // Structure representing connected devices 

的頭文件,我想調用DLL函數: DWORD USMC_Init(USMC_Devices & STR) ;

我試着用這樣的:

class USMCDevices(Structure): 
    _fields_ = [("NOD", c_long), 
      ("Serial", c_char_p), 
      ("Version", c_char_p)] 

usmc = cdll.USMCDLL #this is the dll file 
init = usmc.USMC_Init 
init.restype = c_int32; # return type 
init.argtypes = [USMCDevices]; # argument 
dev = USMCDevices() 
init(dev) 

我這裏得到一個錯誤。我想問題是「串行」和「版本」,這兩個數組都對應於NOD(設備數量)。

任何想法如何解決這個問題?

我真的很感謝你的幫助!

回答

2

對於char **指針使用POINTER(c_char_p)。索引SerialVersion爲給定的以null結尾的字符串創建一個Python字符串。請注意,超出NOD - 1範圍的數組中的索引要麼產生垃圾值,要麼會導致解釋器崩潰。

C:

#include <windows.h> 

typedef struct USMC_Devices_st { 
    DWORD NOD;  // Number of the devices ready to work 
    char **Serial; // Array of 16 byte ASCII strings 
    char **Version; // Array of 4 byte ASCII strings 
} USMC_Devices; 

char *Serial[] = {"000000000000001", "000000000000002"}; 
char *Version[] = {"001", "002"}; 

__declspec(dllexport) DWORD USMC_Init(USMC_Devices *devices) { 

    devices->NOD = 2; 
    devices->Serial = Serial; 
    devices->Version = Version; 

    return 0; 
} 

// build: cl usmcdll.c /LD 

的Python:

import ctypes 
from ctypes import wintypes 

class USMCDevices(ctypes.Structure): 
    _fields_ = [("NOD", wintypes.DWORD), 
       ("Serial", ctypes.POINTER(ctypes.c_char_p)), 
       ("Version", ctypes.POINTER(ctypes.c_char_p))] 

usmc = ctypes.cdll.USMCDLL 
init = usmc.USMC_Init 
init.restype = wintypes.DWORD 
init.argtypes = [ctypes.POINTER(USMCDevices)] 
dev = USMCDevices() 
init(ctypes.byref(dev)) 

devices = [dev.Serial[i] + b':' + dev.Version[i] 
      for i in range(dev.NOD)] 
print('\n'.join(d.decode('ascii') for d in devices)) 

輸出:

000000000000001:001 
000000000000002:002 
+0

謝謝你非常非常多! 你已經幫了我很多了! 但是,我仍然有一個問題。 dev.Serial [i] .value的指針不指向正確的位置。例如:在索引i = 0或i = 1時,我在dev.Serial [2] .value處得到了一個正確的串行字符串。我得到了錯誤的數據(數組的大小隻有兩個)。有任何想法嗎??? – jankos

+0

此外:如果我將Structure更改爲並定義第一個版本,然後定義Serial,那麼該字符串位於dev.Serial [1]處,並且所有其他索引都會給出錯誤的結果。我真的很感激提示! – jankos

+0

非常感謝。它現在有效!其他功能也正在工作。你幫了我很多!謝謝你,祝你有美好的一天! – jankos