WOSA的C#实践

更新时间:2023-10-07 05:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

WOSA/XFS的C#实践

前言

金融服务扩展的一个关键内容就是对一组API、一组相应的SPI和支持服务的定义,使金融服务能够使用以Windows为基础的应用程序。

下面是典型的API使用方案。本例以打印表格所用的函数举例说明。

●? StartUp(启动,将应用程序连接到XFS管理器,包括版本协商) ●? Open(打开,在应用程序和服务提供程序间建立会话)

●? Register(注册,指定应用程序应该从服务提供程序收到的消息) ●? Lock(锁定,通过应用程序获得对服务的唯一访问) ●? 多个Execute(执行)函数,传递一个或多个具体命令: ●? Print_Form(打印表格) ●? 等等

●UnLock(解锁,通过应用程序获得对服务的唯一访问) ●Deregister(注销,指定应用程序不再从服务提供程序收到消息) ●Close(关闭,结束应用程序和服务提供程序间的会话) ●CleanUp(清除,断开应用程序和XFS管理器的连接)

使用C#开发WOSA过程中。 Startup:

uint dwVersion = 0x0B020003;

var lpwfVersion = newWFSVERSION();

int result = _dllwrapper.WFSStartUp(dwVersion, ref lpwfVersion); Open:

_dllwrapper.WFSCreateAppHandle(ref app); uint dwVersion = 0x0b020003;

WFSVERSION srvcVersion = newWFSVERSION(); WFSVERSION spiVersion = newWFSVERSION();

var hr = _dllwrapper.WFSOpen(pszName, app, appName, WFSConstants.WFS_TRACE_ALL_API|WFSConstants.WFS_TRACE_MGR, WFSConstants.WFS_INDEFINITE_WAIT, dwVersion, ref srvcVersion, ref spiVersion, ref service);

其中,pszName,服务名称需和SP方确定具体名称

Register:

var pinpadRegister = _dllwrapper.WFSRegister(pinpadService, WFSConstants.EXECUTE_EVENTS | WFSConstants.SERVICE_EVENTS | WFSConstants.USER_EVENTS | WFSConstants.SYSTEM_EVENTS,

mainPtr); LogErr(pinpadRegister,\);

var cardReader = _dllwrapper.WFSRegister(cardService,

WFSConstants.EXECUTE_EVENTS | WFSConstants.SERVICE_EVENTS , mainPtr); LogErr(cardReader,\);

Excute:

WFSPINGETPIN getPin= newWFSPINGETPIN(); getPin.bAutoEnd = true; getPin.cEcho = '*';

getPin.ulActiveFDKs = 0x00000000; getPin.ulActiveKeys = 0x00001FFF; getPin.ulTerminateFDKs = 0x00000000; getPin.ulTerminateKeys = 0x00000400; getPin.usMaxLen = 6; getPin.usMinLen = 4;

int size = Marshal.SizeOf(getPin);

IntPtr buffer = Marshal.AllocHGlobal(size); try

{

Marshal.StructureToPtr(getPin,buffer,false);

var hr= _dllwrapper.WFSAsyncExecute(pinpadService, PinConstants.WFS_CMD_PIN_GET_PIN, buffer, WFSConstants.WFS_INDEFINITE_WAIT,

mainPtr, ref getPinRequestId); LogErr(hr, \); }

执行命令时,buffer为命令的参数,应为指针类型,可使用Marshal来处理生成。

WPF接收XFS Manager发的消息,并根据消息来处理

privatevoid Window_Loaded(object sender, RoutedEventArgs e) {

mainPtr = newWindowInteropHelper(this).Handle; HwndSource hs = HwndSource.FromHwnd(mainPtr);

hs.AddHook(newHwndSourceHook(TestHwndSourceHook)); }

privateIntPtr TestHwndSourceHook(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, refbool handled) { switch (msg) {

caseWFSConstants.WFS_EXECUTE_EVENT:

this.Dispatcher.Invoke((Action)(() => { Log(\); try

{

WFSRESULT result = (WFSRESULT)Marshal.PtrToStructure(lparam, typeof(WFSRESULT));

if (result.RequestID==getPinRequestId) {

WFSPINKEY key = (WFSPINKEY) Marshal.PtrToStructure(result.lpBuffer, typeof (WFSPINKEY));

Log(string.Format(\{0},complete:{1}\,key.ulDigit,key.wCompletion)); if (key.ulDigit==0x2a) {

tb_PassWord.Text += \; }

if (key.ulDigit==PinConstants.WFS_PIN_FK_BACKSPACE) {

}

if (key.ulDigit==PinConstants.WFS_PIN_FK_CANCEL)

{

_dllwrapper.WFSCancelAsyncRequest(pinpadService, getPinRequestId);

} }

} catch (Exception e) {

Log(e.Message);

}

})); break;

caseWFSConstants.WFS_USER_EVENT:

this.Dispatcher.Invoke((Action)(() => { Log(\); })); break;

caseWFSConstants.WFS_SERVICE_EVENT:

this.Dispatcher.Invoke((Action)(() => { Log(\); })); break;

caseWFSConstants.SYSTEM_EVENTS:

this.Dispatcher.Invoke((Action)(() => { Log(\); })); break;

}

returnIntPtr.Zero; }

要点:

所有的结构体,因在C头文件中定义为#pragmapack(push,1)

应使用LayoutKind.Explicit来标记 并使用FieldOffset来设置开始位置

本文来源:https://www.bwwdw.com/article/ri6d.html

Top