如何使用 DllImport 函数获取结构字符[] 字段值



In 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 true 值是"218699",但我在 C# 中得到了"99?"。

这是为什么呢?谁能帮我?非常感谢!

有点

猜测,但是如果您偏离四个字节,也许前两个字段太大了? 试试这个:

[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;
}
我认为

你的类型错误。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 这将恰好说明缺少 -> 99 = 4 个字符的218699

结构声明不正确。前两个成员应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
);

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

完全

有可能根据尚未显示的数据流意图out某些ref参数。

另一个潜在的问题是你如何调用函数。您没有显示通话或必须如何完成的任何详细信息。

最新更新