Oma*_*mar 6 c# com opos pos-for-.net
我们正在尝试为POS应用程序创建类似打印机驱动程序包装器的东西,这样我们就可以捕获打印的收据,然后再将它转发到原始打印机.
到目前为止,我们在"POS for .Net"之上实现了一个服务对象,它运行良好且一切都很好,但事实证明一些传统POS应用程序仅支持OPOS.为了支持它们,我们必须使我们的"POS for .Net"服务对象可用作OPOS服务对象,或者我们必须使用CCO编写我们自己的OPOS服务对象.
我的问题是:
问)在这些传统的POS应用程序中,甚至可以使用我们的POS for .Net解决方案吗?(如果是,怎么样?)
A)不,这些应用程序不使用POS用于.Net库,也不使用POS for .Net注册表项搜索服务对象,这些应用程序仅使用OPOS(OLE POS)注册表项来搜索注册的服务对象,通常调用CCO,后者又调用服务对象.
问)如何构建OPOS服务对象?它可以使用.Net框架(例如C#)吗?
A)是的,可以使用.Net完成,但是你需要将它作为COM库公开,一个好方法是在CCO中实现接口,每个设备都有一个DLL,引用你需要的设备的DLL ,实现其接口,并将您的类型标记为COM可见,添加GUID和ProgId,使用regasm"path"/ register/codebase/tlb命令注册它,添加所需的注册表项 - 可以在UPOS规范中找到\开发指南文档 - 你将完成,或者至少我想到的是,你会得到一个错误,指出你的服务对象缺少正确运行它所需的方法,我发现这很难,但有7种方法未在接口中引用 - 尽管在UPOS规范\开发指南文档中引用 - 这些方法是:
实现这些方法之后一切正常,这很奇怪,因为没有在CCO接口中引用,但是正如我所说的那些在UPOS规范中引用并具有完整描述.
这似乎是OpenService和CloseService方法存在的原因,当CCO库实现为com时,Open和Close方法名称不合适并且必须更改为OpenService和CloseService,同样适用于具有新名称的Claim和Release ClaimDevice和Release Device - 但是这些在接口中正确暴露,因为其他方法我找不到原因.
获取\设置属性方法
这4个方法用于访问对象中的所有属性,为什么?我不确定,但似乎应该从Dispatch界面使用这些来访问你的对象,为什么默认情况下该接口不可用?C++服务对象是否以相同的方式实现?我没有答案.
要以正确的方式实现这些,应该查看OPOS安装下的Include目录 - CCO安装 - 并检查*.hi文件,主要是Opos.hi和OposPtr.hi(取决于设备,在我们的例子中是打印机) ,您将看到这些包括CCO的常量,如成功或失败枚举,以及这4个方法的属性索引和设备索引偏移.
通过使用OPOS常量中的数字,您只需要打开PropIndex参数值,并获得\设置正确的属性值.
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;
.
.
.
.
.
Run Code Online (Sandbox Code Playgroud)