在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#。
为什么这样?谁能帮我?吃了很多!
答案 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
,具体取决于尚未显示的数据流意图。
另一个潜在的问题是你如何调用该函数。你没有显示电话或任何必须完成的细节。