如何获取struct char []字段值使用DllImport函数?

时间:2018-01-24 06:23:59

标签: c# pinvoke

在DLL结构中是:

typedef struct tagEKIDinfo{
    short usbNo;   
    short printerID;   
    CHAR  serialNo[6];   
    WORD  mediaType;   
} EKIDinfo, *PEKIDinfo;

在C#中:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct EKIDinfo
{
    public int usbNo;
    public int printerID;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
    public string serialNo;
    public ushort mediaType;
}

功能是:

DLL:

DWORD WINAPI EKSearchPrinters( PEKIDinfo pIDInfo, DWORD infoSize, LPDWORD pSizeNeeded, LPDWORD pinfoNum ) 

C#:

[DllImport("EKUSB.dll", EntryPoint = "EKSearchPrinters", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int EKSearchPrinters(IntPtr hPrinter, Int32 infoSize, ref Int32 pSizeNeeded, ref Int32 pNumber);

serialNo的真值是" 218699",但我得到了" 99?"用C#。

为什么这样?谁能帮我?吃了很多!

3 个答案:

答案 0 :(得分:2)

有点猜测,但是如果你关闭四个字节,也许前两个字段太大了?试试这个:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct EKIDinfo
{
    public System.Int16 usbNo;      //<--- changed
    public System.Int16 printerID;  //<--- changed
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
    public string serialNo;
    public ushort mediaType;
}

答案 1 :(得分:0)

我认为你的错误类型。 DLL接口说

struct tagEKIDinfo {
     short usbNo;       <- short (2 bytes), not int (4bytes)
     short printerID;   <- short (2 bytes), not int (4bytes)
     CHAR  serialNo[6];   
     WORD  mediaType;   
 }

请注意short。这可能是C#方int16,而不是int,就像你现在一样。由于有2个这样的字段,所有字符都在字符数组之前,2x(4-2)= 4,这将完全归于218699 - &gt; 99 = 4个字符缺失

答案 2 :(得分:0)

结构声明不正确。前两个成员应为short

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct EKIDinfo
{
    public short usbNo;
    public short printerID;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
    public string serialNo;
    public ushort mediaType;
}

不是手动编组结构,而是通过引用传递它。

[DllImport("EKUSB.dll", CallingConvention = CallingConvention.StdCall)]
public static extern uint EKSearchPrinters(
    ref EKIDinfo pIDInfo,
    uint infoSize, 
    ref uint pSizeNeeded,
    ref uint pNumber
);

我不确定你为什么要给第一个参数建议一个句柄,但它对我来说肯定不像。

完全有可能某些ref参数应为out,具体取决于尚未显示的数据流意图。

另一个潜在的问题是你如何调用该函数。你没有显示电话或任何必须完成的细节。