Ehtsham
Ehtsham

Reputation: 228

Marshalling C++ Structures into c#

how we will code these structures(Written in C++) in C#

typedef struct
{
    USHORT idVendor;
    USHORT idProduct;
    USHORT bcdDevice;
    CHAR szSerialNumber[256];
} FT_USB_UNIQID, *PFT_USB_UNIQID;

typedef struct {
    FT_USB_UNIQID usbHWID;
    eFtUsbDeviceStatus status;
    BOOL bExcludeDevice;
    BOOL bSharedManually;
    ULONG ulDeviceId;
    ULONG ulClientAddr;
    CHAR szUsbDeviceDescr[256];
    CHAR szLocationInfo[256];
    WCHAR szNickName[256];
} FT_SERVER_USB_DEVICE, *PFT_SERVER_USB_DEVICE;

Upvotes: 2

Views: 750

Answers (2)

Abdul jalil
Abdul jalil

Reputation: 124

use ansi in first structure as

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct FT_USB_UNIQID
{
    ......
}

you will split the second structure as this struct contain mixed string of ansi and unicode you will split this struct as

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SZNickName
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    public string NickName;
}

and your FT_SERVER_USB_DEVICE will use CharSet.Ansi as

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]                  
public struct FT_SERVER_USB_DEVICE               
{        
    public FT_USB_UNIQID usbHWID;      
    public eFtUsbDeviceStatus status;       
    public bool bExcludeDevice;       
    public bool bSharedManually;          
    public uint ulDeviceId;       
    public uint ulClientAddr;         
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]        
    public string szUsbDeviceDescr;         
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]        
    public string szLocationInfo;         
    public SZNickName szNickName;  
 }

Upvotes: 1

Aamir
Aamir

Reputation: 15546

Like this:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FT_USB_UNIQID
{
    public ushort idVendor; 
    public ushort idProduct;
    public ushort bcdDevice;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    public string szSerialNumber;
 }

and this:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FT_SERVER_USB_DEVICE
{
    public FT_USB_UNIQID usbHWID;
    public eFtUsbDeviceStatus status;
    public bool bExcludeDevice;
    public bool bSharedManually;
    public uint ulDeviceId;
    public uint ulClientAddr;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    public string szUsbDeviceDescr;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    public string szLocationInfo;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    public string szNickName;
 }

Upvotes: 3

Related Questions