我正在将对Zebra打印机的RFID编程支持添加到现有的打印应用程序中。为了对RFID芯片进行编程,我需要使用带有PASSTHROUGH
标志的Windows API调用ExtEscape
发送一些原始打印机代码。
我已经导入了这样的函数。
[DllImport("gdi32.dll", SetLastError = true, ExactSpelling = true, CharSet = CharSet.Ansi)]
public static extern int ExtEscape(IntPtr hDC, int nEscape, int cbInput, IntPtr inData, int cbOutput, IntPtr outData);
我遇到的问题是,当与PASSTHROUGH
标志一起使用时,IntPtr需要指向一个具有大小和数据的结构。我已经这样定义了结构。
public struct PasstroughData
{
public Int32 Size;
public byte[] Data;
}
所以问题是;如何将其转换为可用于调用ExtEscape
的内容?
尝试这样的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Runtime.InteropServices;
namespace ConsoleApplication40
{
class Program
{
static void Main(string[] args)
{
int size = 12;
PasstroughData data = new PasstroughData();
data.Size = 32;
data.Data = new byte[size];
int sz = Marshal.SizeOf(data);
//add 4 bytes in the Size property which is an integer
IntPtr BLOB = Marshal.AllocHGlobal(size + 4);
Marshal.WriteInt32(BLOB, 0, data.Size);
//copy to offset 4
Marshal.Copy(data.Data, 0, BLOB + 4, size);
}
public struct PasstroughData
{
public Int32 Size;
public byte[] Data;
}
}
}