C# 实现用于捕获打印文本的OPOS打印机服务对象
我们正在尝试为POS应用程序创建一个类似打印机驱动程序包装的东西,它允许我们捕获打印的收据,然后再次将其转发到原始打印机 到目前为止,我们在“POS for.Net”之上实现了一个作为服务对象的应用程序,它工作得非常好,而且一切都很好,但事实证明,一些旧式POS应用程序只支持OPO。为了支持它们,我们要么将“POS for.Net”服务对象作为OPOS服务对象提供,要么使用CCOs编写自己的OPOS服务对象 我的问题是:C# 实现用于捕获打印文本的OPOS打印机服务对象,c#,com,opos,pos-for-.net,C#,Com,Opos,Pos For .net,我们正在尝试为POS应用程序创建一个类似打印机驱动程序包装的东西,它允许我们捕获打印的收据,然后再次将其转发到原始打印机 到目前为止,我们在“POS for.Net”之上实现了一个作为服务对象的应用程序,它工作得非常好,而且一切都很好,但事实证明,一些旧式POS应用程序只支持OPO。为了支持它们,我们要么将“POS for.Net”服务对象作为OPOS服务对象提供,要么使用CCOs编写自己的OPOS服务对象 我的问题是: 在这些传统POS应用程序中,是否可以使用我们的POS for.Net解决
- 在这些传统POS应用程序中,是否可以使用我们的POS for.Net解决方案?(如果是,怎么做?)
- 如何构建OPOS服务对象?它是否可以使用.Net框架(例如C#)
- 我们做的对吗?是否有更好的方法来获取收据(尤其是对于这些遗留应用)
if (PropertyIndexHelper.IsStringPidx(PropIndex))
{
switch (PropIndex)
{
case PropertyIndexHelper.PIDX_CheckHealthText:
return _physicalPrinter.CheckHealthText;
case PropertyIndexHelper.PIDX_DeviceDescription:
return _physicalPrinter.DeviceDescription;
case PropertyIndexHelper.PIDX_DeviceName:
return _physicalPrinter.DeviceName;
.
.
.
.
.
为了进一步说明MEYWD的答案,我只想发布C#中的基本界面应该是什么样子 虽然这是针对MSR的,但CommonOPOS方法在所有类型的设备上都是相同的。因此,您唯一需要更改的是从DispID 0x14(20)开始。我所做的是与OPOS文件进行比较,他们将其签名并将其转换为C。我已经创建了大约6个这样的场景,在各种不同的场景中都可以正常工作 另一个注意事项是OpenService方法。您将看到最后一个参数是一个对象。这是控件对象的实例。您需要做的是在项目中创建另一个接口,为您公开COM对象。坚持我的MSR示例,这里是您将要放置的内容
[ComImport, Guid("CCB91121-B81E-11D2-AB74-0040054C3719"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface COPOSMSR
{
void SOData([In] int Status);
void SODirectIO([In] int EventNumber, [In, Out] ref int pData, [In, Out, MarshalAs(UnmanagedType.BStr)] ref string pStrIng);
void SOError([In] int ResultCode, [In] int ResultCodeExtended, [In] int ErrorLocus, [In, Out] ref int pErrorResponse);
void SOOutputCompleteDummy([In] int OutputID);
void SOStatusUpdate([In] int Data);
void SOProcessID([Out] out int pProcessID);
}
我在OPOS的源代码中添加了签名。如果你搜索源代码,你会看到像这样的评论。。(来自msr OPOS源代码)这样您就知道要实现什么,从而可以触发事件
c:\ProgramFiles(x86)\Opos\oposrc\zMSR\MSR.idl
[
object,
uuid(CCB91121-B81E-11D2-AB74-0040054C3719),
dual,
helpstring("IOPOSMSR 1.5 Interface"),
pointer_default(unique)
]
interface IOPOSMSR_1_5 : IDispatch
{
// Methods for use only by the Service Object
[id(1), hidden, helpstring("method SOData")] HRESULT SOData( [in] long Status );
[id(2), hidden, helpstring("method SODirectIO")] HRESULT SODirectIO( [in] long EventNumber, [in, out] long* pData, [in, out] BSTR* pString );
[id(3), hidden, helpstring("method SOError")] HRESULT SOError( [in] long ResultCode, [in] long ResultCodeExtended, [in] long ErrorLocus, [in, out] long* pErrorResponse );
[id(4), hidden, helpstring("method SOOutputCompleteDummy")] HRESULT SOOutputCompleteDummy( [in] long OutputID );
[id(5), hidden, helpstring("method SOStatusUpdate")] HRESULT SOStatusUpdate( [in] long Data );
[id(9), hidden, helpstring("method SOProcessID")] HRESULT SOProcessID( [out, retval] long* pProcessID );
有了这两件基本的事情,你就可以做出一个如此。。发起一项活动也非常容易。下面是我如何做的测试
public int OpenService(string lpclDevClass, string lpclDevName, object lpDispatch)
{
controlObject = (COPOSMSR)lpDispatch;
controlObject.SOData(1)//I just fired a Data Event
}
这是我的经验
public int OpenService(string lpclDevClass, string lpclDevName, object lpDispatch)
{
controlObject = (COPOSMSR)lpDispatch;
controlObject.SOData(1)//I just fired a Data Event
}