sizeof(cstring*)*pcount
слишком мало. Расчет размера ошибочен.
Избегайте ошибок выделения. Используйте эту идиому для кода, который легче писать правильно, просматривать и поддерживать. Обратите внимание, что не используется тип .
pointer = malloc(sizeof *pointer * n);
Тогда код становится:
// options = malloc(sizeof(cstring*)*pcount);
options = malloc(sizeof *options * pcount);`
Необходимо действительно рассмотреть использование POS для.NET и OPOS или объектов службы.NET (Epson, например, предоставляет обоим). НА МЕСТЕ ПРОДАЖИ для.NET соответствует промышленному стандарту UnifiedPOS для взаимодействия через интерфейс с этими устройствами.
Если принтер регистрирует себя как Устройство Интерфейса пользователя, Вы можете P/INVOKE в соответствующие API Win32. Вот подписи:
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_FlushQueue( SafeFileHandle HidDeviceObject );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_FreePreparsedData( ref IntPtr PreparsedData );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_GetAttributes( SafeFileHandle HidDeviceObject
, ref HIDD_ATTRIBUTES Attributes );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_GetFeature( SafeFileHandle HidDeviceObject
, ref Byte lpReportBuffer
, Int32 ReportBufferLength );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_GetInputReport( SafeFileHandle HidDeviceObject
,ref Byte lpReportBuffer
,Int32 ReportBufferLength );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern void HidD_GetHidGuid( ref System.Guid HidGuid );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_GetNumInputBuffers( SafeFileHandle HidDeviceObject
, ref Int32 NumberBuffers );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_GetPreparsedData( SafeFileHandle HidDeviceObject
,ref IntPtr PreparsedData );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_SetFeature( SafeFileHandle HidDeviceObject
, ref Byte lpReportBuffer
, Int32 ReportBufferLength );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_SetNumInputBuffers( SafeFileHandle HidDeviceObject
,Int32 NumberBuffers );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_SetOutputReport( SafeFileHandle HidDeviceObject
,ref Byte lpReportBuffer
,Int32 ReportBufferLength );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Int32
HidP_GetCaps( IntPtr PreparsedData, ref HIDP_CAPS Capabilities );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Int32
HidP_GetValueCaps( Int16 ReportType
, ref Byte ValueCaps
, ref Int16 ValueCapsLength
, IntPtr PreparsedData );
Существует обертка C# для API Win32 USP от icsharpcode парней здесь, и я видел по крайней мере еще одну ссылку на материал USB в .NET.
То, что может быть хитрым, - требует ли Принтер OPOS для функционирования. Я сделал некоторую работу над проектом POS в .NET несколько лет назад, и от того, что я помню, что OPOS является в значительной степени стандартом для аппаратной стороны вещей (И в то время все API OPOS, используемые взаимодействующий с COM). Устройства иногда также имеют зарегистрированный собственный коммуникационный протокол, в этом случае необходимо смочь использовать это, чтобы говорить с устройством, пользующимся библиотекой USB.
Если Вы уже прокрутили свой собственный код управления принтера затем, можно передать команды прямо через принтеру путем установки принтера с помощью "Дженерика / текст" драйвер принтера на USB-порте. Тот драйвер не даст иное толкование кодам управления и попытается распечатать их, но он просто передаст их к принтеру как есть.
Затем USB-порт может использоваться точно так же, как любой другой принтер.
Этот подход работал на меня в системе POS, которую я разработал.