I've looked through other answers but can't seem to get this to work. I'm trying to call a function within a DLL for communicating with SMBus devices. This function takes a pointer to a struct, which has an array as one of it's fields. so... In C: typedef struct _SMB_REQUEST { unsigned char Address; unsigned char Command; unsigned char BlockLength; unsigned char Data[SMB_MAX_DATA_SIZE]; } SMB_REQUEST; I think I have to set values for the Address, Command and BlockLength while the DLL fills the Data array. The function that requires this struct takes it as a pointer SMBUS_API int SmBusReadByte( SMBUS_HANDLE handle, SMB_REQUEST *request ); So I've set up the struct in Python like so: class SMB_REQUEST(ctypes.Structure): _fields_ = [("Address", c_char), ("Command", c_char), ("BlockLength", c_char), ("Data", type(create_string_buffer(SMB_MAX_DATA_SIZE))] *Note: I've also tried ctypes.c_char*SMB_MAX_DATA_SIZE for the data type* To pass a pointer to a struct of this type to the function I have tried to initialise it first as follows: data = create_string_buffer(SMB_MAX_DATA_SIZE) smb_request = SMB_REQUEST('\x53', \x00', 1, data) This responds with: TypeError: expected string or Unicode object, c_char_Array_32 found If I try leaving out the data array, like so: smb_request = SMB_REQUEST('\x53', \x00', 1) No, error. However, then when I try to pass this to the function: int_response = smbus_read_byte(smbus_handle, smb_request)) I get: ArgumentError: argument 2: <type 'exceptions.TypeError'>: expected LP_SMB_REQUES T instance instead of SMB_REQUEST I've tried passing it as a pointer: int_response = smbus_read_byte(smbus_handle, ctypes.POINTER(smb_request)) and I get: ----> 1 2 3 4 5 TypeError: must be a ctypes type Here's how I've set up the art types: smbus_read_byte.argtypes = (ctypes.c_void_p, ctypes.POINTER(SMB_REQUEST)) I've tried casting but still no go. Can anyone shed some light on this for me? Update: If I first initialise the struct like so: smb_request = SMB_REQUEST('\xA6', '\x00', chr(1), 'a test string') and then bass by reference: int_response = smbus_receive_byte(smbus_handle, ctypes.byref(smb_request)) I get no error. However, the function returns -1 when it should return '0' for success and non-zero for a fail. Checking the value of smb_request.Data gives back 'a test string' so no change there. Any suggestions as to what might be going on here would be greatly appreciated. Thanks UPDATE: Since I've gotten a couple of enquiries about whether my handle is correct, here's how I'm using it. The header file for the DLL declares the following: typedef void *SMBUS_HANDLE; // // This function call initializes the SMBus, opens the driver and // allocates the resources associated with the SMBus. // All SMBus API calls are valid // after making this call except to re-open the SMBus. // SMBUS_API SMBUS_HANDLE OpenSmbus(void); So here's how I'm doing this in python: smbus_handle = c_void_p() # NOTE: I have also tried it without this line but same result open_smbus = CDLL('smbus.dll').OpenSmbus smbus_handle = open_smbus() print 'SMBUS_API SMBUS_HANDLE OpenSmbus(void): ' + str(smbus_handle) I call this before making the call to smbus_read_byte(). I have tried to set open_smbus.restype = c_void_p() but I get an error: TypeError: restype must be a type, a callable, or None Continue reading...