網上有很多關于pos機遠程刷卡步驟,VC實現遠程對象函數調用的知識,也有很多人為大家解答關于pos機遠程刷卡步驟的問題,今天pos機之家(www.www690aa.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
pos機遠程刷卡步驟
VC實現遠程對象方法調用及事件訂閱觸發,方便開發C/S系統
參考flash遠程共享對象,方便客戶端調用遠程功能,可同時包含多個應用,一個應用下包含多個遠程對象,遠程應用對象的目錄結構如下圖
網絡通訊部分采用完成端口模式,通訊數據采用封裝數據對象XVarArray,該對象支持基本數據類型int int64 bytes long float char *,該對象常用函數如下:
static bool AttachBytes(BYTE *pByte,int nLength,OutManyVarArray &m_OutManyVarArray);
void Copy(XVarArray &m_XVarArray);
bool RemoveElementAt(int nIndex);
int GetElementCount();
bool ReadElement(void *pElement,BYTE &nType,int &L);
bool SetOrderElementPos(int nNum);//設置到第幾個元素
bool ReadObj(void *pObj,int &L);
bool ReadBytes(BYTE *pByte,int &L);
bool ReadStr(char *pStr,int &L);
bool ReadInt64(__int64 &iZhi64);
bool ReadFloat(float &fZhi);
bool ReadInt(int &iZhi);
void SetRealPos(int nPostion);
void SetRealPosEnd();
void SetRealPosBegin();
void WriteObj(void *pObj,int L);
void WriteBytes(unsigned char *pByte,int L);
void WriteStr(char *pStr);
void WriteInt64(__int64 iZhi64);
void WriteFloat(float fZhi);
void WriteInt(int nZhi);
XVarArray & operator =(XVarArray &Var);
封裝的遠程對象基類,方便編寫遠程對象
#include "..\\include\\XNetEvent.h"
typedef map<string,XNetEvent *>XNetEventType;//對象的所有事件
class AFX_EXT_CLASS XOneObject
{
public:
void GetEvents(CStringArray &m_EventArray);
void DebugObj(char *pStr);
void *pXOneApp;
bool bDIYEvent;//自定義觸發事件
void InitPack();
virtual void RemoveSOCKET(SOCKET s);//一個SOCKET 掉線
void RemoveSEvent(SOCKET s);
HANDLE hNet;
DWORD pBasePack;//公有對象使用同一個,私有對象擁有獨立連接的
void AddOneEvent(char *sEventName);
void PostEvent(char *sEventName,XVarArray &m_XVarArray);
bool bPublic;
CString sAppName;
CString sObjName;
CStringArray m_EventNameArray;
virtual void InitObjEvent();
bool CallClientFunc(char *sFName,XVarArray &InVarArray,XVarArray &OutVarArray);
bool GetAllFuncNameArray(CStringArray &NameArray);
typedef bool (XOneObject::*pCLASSFUNC)(SOCKET s,XVarArray &InVarArray, XVarArray &OutVarArray,bool &bClose,DWORD &dwObject,int nThreadNO);
typedef map<string,pCLASSFUNC>XCLASSFUNC;
XOneObject();
virtual ~XOneObject();
virtual void InitObject();
virtual XOneObject * GetAnOtherObject();
int nTestZhi;
bool ExampFunc(SOCKET s,XVarArray &InVarArray, XVarArray &OutVarArray,bool &bClose,DWORD &dwObject,int nThreadNO);
void PushFuncName(char *sFName,pCLASSFUNC pFunc);
bool CallFunc(char *sFName,SOCKET s,XVarArray &InVarArray,XVarArray &OutVarArray,bool &bClose,DWORD &dwObject,int nThreadNO);
bool AttachOneEvent(char *sEventName,SOCKET s,char *sUserID);
protected:
XCLASSFUNC m_XCLASSFUNC;
XNetEventType m_XNetEventType;
};
派生該基類實現遠程對象如:
class XShareObjectNO2:public XOneObject
{
public:
//典型的對象函數 參數s:網絡連接SOCKET ,InVarArray:輸入參數:OutVarArray:輸出參數,bClose:返會true表示斷開連接,nThreadNO:表示在服務端低幾個線程調用
bool JsonFunction(SOCKET s,XVarArray &InVarArray, XVarArray &OutVarArray,bool &bClose,DWORD &dwObject,int nThreadNO);
void InitObjEvent();//初始化對象事件
bool AddStr(SOCKET s,XVarArray &InVarArray, XVarArray &OutVarArray,bool &bClose,DWORD &dwObject,int nThreadNO);
XOneObject * GetAnOtherObject();
bool MyFunc(SOCKET s,XVarArray &InVarArray, XVarArray &OutVarArray,bool &bClose,DWORD &dwObject,int nThreadNO);
void InitObject();//初始化對象基本參數
XShareObjectNO2();
virtual ~XShareObjectNO2();
};
實現類:
XShareObjectNO2::XShareObjectNO2()
{
}
XShareObjectNO2::~XShareObjectNO2()
{
}
void XShareObjectNO2::InitObject()
{MyFunc
PushFuncName("MyFunc",static_cast<XOneObject::pCLASSFUNC>(&XShareObjectNO2::MyFunc));//初始對象函數MyFunc指向函數MyFunc
PushFuncName("AddStr",static_cast<XOneObject::pCLASSFUNC>(&XShareObjectNO2::AddStr));//初始對象函數AddStr指向函數AddStr
PushFuncName("JsonFunction",static_cast<XOneObject::pCLASSFUNC>(&XShareObjectNO2::JsonFunction));//初始對象函數AddStr指向函數JsonFunction
}
bool XShareObjectNO2::MyFunc(SOCKET s,XVarArray &InVarArray, XVarArray &OutVarArray,bool &bClose,DWORD &dwObject,int nThreadNO)
{
bClose=false;
InVarArray.SetRealPosBegin();
int a,b;
InVarArray.ReadInt(a);
InVarArray.ReadInt(b);
int c=a*b;
OutVarArray.WriteInt(c);
OutVarArray.SetRealPosBegin();
return true;
}
XOneObject * XShareObjectNO2::GetAnOtherObject()
{
XShareObjectNO2 *pShareObjectNO2=new XShareObjectNO2();
pShareObjectNO2->InitObject();
pShareObjectNO2->InitObjEvent();
pShareObjectNO2->hNet=hNet;
return pShareObjectNO2;
}
bool XShareObjectNO2::AddStr(SOCKET s,XVarArray &InVarArray, XVarArray &OutVarArray,bool &bClose,DWORD &dwObject,int nThreadNO)
{
bClose=false;
InVarArray.SetRealPosBegin();
char Str1[200],Str2[200];
int L;
InVarArray.ReadStr(NULL,L);
char *pStr1=new char [L+1];
InVarArray.ReadStr(pStr1,L);
pStr1[L]=0;
InVarArray.ReadStr(NULL,L);
char *pStr2=new char [L+1];
InVarArray.ReadStr(pStr2,L);
pStr2[L]=0;
CString TStr;
TStr.Format("%s%s",pStr1,pStr2);
delete[]pStr1;
delete[]pStr2;
OutVarArray.WriteStr((char *)(const char *)TStr);
OutVarArray.SetRealPosBegin();
XVarArray m_XVarArray0;
m_XVarArray0.WriteStr("DataChange 事件觸發的消息");
PostEvent("DataChange",m_XVarArray0);//觸發DataChange事件
return true;
}
void XShareObjectNO2::InitObjEvent()
{
AddOneEvent("DataChange");//初始化對象事件DataChange
AddOneEvent("JsonEvent");//初始化對象事件JsonEvent
}
bool XShareObjectNO2::JsonFunction(SOCKET s, XVarArray &InVarArray, XVarArray &OutVarArray, bool &bClose, DWORD &dwObject, int nThreadNO)
{
bClose=false;
InVarArray.SetRealPosBegin();
int L;
InVarArray.ReadStr(NULL,L);
char *pStr=new char[L+1];
memset(pStr,0,L+1);
InVarArray.ReadStr(pStr,L);
OutVarArray.WriteStr(pStr);
PostEvent("JsonEvent",OutVarArray);
delete[]pStr;
return true;
}
對象dll裝載公有輸出函數如:
extern DWORD WINAPI GetOneObject(char *sObjectName)//獲得指定名稱的遠程對象
{
if(strcmp(sObjectName,"XShareObjectNO1")==0)
{
XShareObjectNO1 *pShareObjectNO1=new XShareObjectNO1();
pShareObjectNO1->InitObject();
pShareObjectNO1->InitObjEvent();
return (DWORD)pShareObjectNO1;
}
else
{
if(strcmp(sObjectName,"XShareObjectNO2")==0)
{
XShareObjectNO2 *pShareObjectNO2=new XShareObjectNO2();
pShareObjectNO2->InitObject();
pShareObjectNO2->InitObjEvent();
return (DWORD)pShareObjectNO2;
}
}
}
extern bool WINAPI GetModeObjectsName(CStringArray &ObjectNameArray)//獲得當前dll中包含哪些遠程對象名
{
ObjectNameArray.RemoveAll();
ObjectNameArray.Add("XShareObjectNO1");
ObjectNameArray.Add("XShareObjectNO2");
return true;
}
extern bool WINAPI GetOneObjectAllFuncName(DWORD pXOneObject,CStringArray &ObjectFunNameArray) //返回對象包含的函數名
{
XOneObject *pXOneObject0=(XOneObject *)pXOneObject;
pXOneObject0->GetAllFuncNameArray(ObjectFunNameArray);
return true;
}
為方便客戶端調用,封裝客戶端調用框架,目前支持的VC C# Java的客戶端調用
以VC客戶端為例
class AFX_EXT_CLASS XClientNetCtrl
{
public:
void CloseOneNet(char *sAppName);//關閉一個遠程應用
bool CallShareObjectFunc(XClientShareObject *pXClientShareObject,char *sFName,XVarArray &m_VarArray,XVarArray *pOutXVarArray=NULL);//調用遠程對象方法
XClientShareObject * GetOneNetShareObject(char *sAppName,char *sShareObjectName,bool bPerson=false);//獲得一個遠程對象 sAppName:應用名 sShareObjectName:對象名
bool GetOneAppNet(char *sIP,UINT nPort,char *sAppName,pRUNCLASSFUNC pExitNet=NULL,DWORD pXRunShareObjectBase=0);//獲得一個應用
XClientOneNetArray m_XClientOneNetArray;
XClientOneNetFromNameArray m_XClientOneNetFromNameArray;
XClientNetCtrl();
virtual ~XClientNetCtrl();
};
class AFX_EXT_CLASS XClientShareObject //客戶端對象的基類
{
public:
bool EventOutFunc(char *sEventName,XVarArray &OutVarArray);
void AppAdd(HANDLE hNet,char *sPAppName,DWORD pXClientOneNet);
bool OutFuncResult(char *sFName,XVarArray &m_XVarArray);
void AttachXNetFuncReult(char *sFName,DWORD pXRunShareObjectBase,pRUNCLASSFUNC pFunc);
bool ActOneFunc(char *sFName,XVarArray &m_InXVarArray,XVarArray *pOutXVarArray=NULL);//執行運行函數,如果要等待結果那么就要賦pOutXVarArray,如果不用等待只是用結果事件那么不用賦值;
char sName[150];
bool RunOutFunc(char *sEventName);
typedef map<string ,struct RunBaseST *>XRUNCLASSFUNCBASE;
XRUNCLASSFUNCBASE m_XEVENTCLASSFUNCBASE;
XRUNCLASSFUNCBASE m_XFUNCOUTFUNCBASE;
void AttachXNetEvent(char *sEventName,DWORD pXRunShareObjectBase,pRUNCLASSFUNC pFunc);
void AddListenEvent(char *sEventName);
void SetNetEventFunc(NetEvent *pNetEvent0);
NetEvent *pNetEvent;
CStringArray m_ListenNameArray;
void *pParentApp;
bool bPerson;
XClientShareObject();
virtual ~XClientShareObject();
};
客戶端調用的例子
class CNetRunDlg : public CDialog, XRunShareObjectBase
{
// Construction
public:
void OBEventResult(XClientShareObject *pXClientShareObject, char *sEventName, XVarArray &OutXVarArray, DWORD pThis);
void OBFuncResult(XClientShareObject *pXClientShareObject, char *sEventName, XVarArray &OutXVarArray, DWORD pThis);
void OnNetExitEvent(XClientShareObject *pXClientShareObject, char *sEventName, XVarArray &OutXVarArray, DWORD pThis);
CNetRunDlg(CWnd* pParent = NULL); // standard constructor
XClientShareObject *pXShareObject1,*pXShareObject2;
XClientNetCtrl m_XClientNetCtrl;
// Dialog Data
//{{AFX_DATA(CNetRunDlg)
enum { IDD = IDD_NETRUN_DIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CNetRunDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CNetRunDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButton1();
afx_msg void OnButton2();
afx_msg void OnButton4();
afx_msg void OnButton3();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
初始
m_XClientNetCtrl.GetOneAppNet("192.168.0.1",5242,"game",static_cast<pRUNCLASSFUNC>(&CNetRunDlg::OnNetExitEvent),(DWORD)this);//連接服務器
pXShareObject1=m_XClientNetCtrl.GetOneNetShareObject("game","XShareObjectNO1",true);//獲得遠程對象XShareObjectNO1
pXShareObject1->AttachXNetFuncReult("NO2Func",(DWORD)this,static_cast<pRUNCLASSFUNC>(&CNetRunDlg::OBFuncResult));//綁定遠程序對象XShareObjectNO1函數NO2Func返回函數
pXShareObject1->AttachXNetEvent("DataChange",(DWORD)this,static_cast<pRUNCLASSFUNC>(&CNetRunDlg::OBEventResult));//綁定遠程序對象XShareObjectNO1事件函數DataChange
pXShareObject2=m_XClientNetCtrl.GetOneNetShareObject("game","XShareObjectNO2",true);//獲得遠程對象XShareObjectNO2
pXShareObject2->AttachXNetFuncReult("AddStr",(DWORD)this,static_cast<pRUNCLASSFUNC>(&CNetRunDlg::OBFuncResult));//綁定遠程序對象XShareObjectNO2函數NO2Func返回函數
pXShareObject2->AttachXNetEvent("DataChange",(DWORD)this,static_cast<pRUNCLASSFUNC>(&CNetRunDlg::OBEventResult));//綁定遠程序對象XShareObjectNO2事件函數DataChange
void CNetRunDlg::OnNetExitEvent(XClientShareObject *pXClientShareObject, char *sEventName, XVarArray &OutXVarArray, DWORD pThis)
{
CNetRunDlg *pNetRunDlg=(CNetRunDlg *)pThis;
}
void CNetRunDlg::OBFuncResult(XClientShareObject *pXClientShareObject, char *sFuncName, XVarArray &OutXVarArray, DWORD pThis)//*sFuncName:執行的函數,OutXVarArray返回的結果
{
CNetRunDlg *pNetRunDlg=(CNetRunDlg *)pThis;
}
void CNetRunDlg::OBEventResult(XClientShareObject *pXClientShareObject, char *sEventName, XVarArray &OutXVarArray, DWORD pThis)//*sEventName:返回的事件,OutXVarArray返回的結果
{
CNetRunDlg *pNetRunDlg=(CNetRunDlg *)pThis;
char TStr[100];
int L;
OutXVarArray.ReadStr(TStr,L);
TStr[L]=0;
AfxMessageBox(TStr);
}
XShareObjectNO2調用函數
XVarArray m_XVarArray,m_XOutVarArray;
m_XVarArray.WriteStr("中國");
m_XVarArray.WriteStr("北京");
pXShareObject2->ActOneFunc("AddStr",m_XVarArray,&m_XOutVarArray);
char TStr[200];
int L;
m_XOutVarArray.ReadStr(TStr,L);
TStr[L]=0;
AfxMessageBox(TStr);
TRACE("ok");
基于該遠程對象實現一個類QQ的聊天工具PCEQ,實現點對點聊天,群聊,文件傳輸,遠程協助,語音聊天,視頻聊天等常用功能
如今消息生產消費訂閱已經有不少成熟的開發包可調用,而那些年你也是否自己造了一大堆輪子呢?
以上就是關于pos機遠程刷卡步驟,VC實現遠程對象函數調用的知識,后面我們會繼續為大家整理關于pos機遠程刷卡步驟的知識,希望能夠幫助到大家!
