網(wǎng)上有很多關(guān)于pos機(jī)遠(yuǎn)程刷卡步驟,VC實(shí)現(xiàn)遠(yuǎn)程對(duì)象函數(shù)調(diào)用的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)遠(yuǎn)程刷卡步驟的問(wèn)題,今天pos機(jī)之家(m.afbey.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來(lái)看下吧!
本文目錄一覽:
pos機(jī)遠(yuǎn)程刷卡步驟
VC實(shí)現(xiàn)遠(yuǎn)程對(duì)象方法調(diào)用及事件訂閱觸發(fā),方便開(kāi)發(fā)C/S系統(tǒng)
參考flash遠(yuǎn)程共享對(duì)象,方便客戶端調(diào)用遠(yuǎn)程功能,可同時(shí)包含多個(gè)應(yīng)用,一個(gè)應(yīng)用下包含多個(gè)遠(yuǎn)程對(duì)象,遠(yuǎn)程應(yīng)用對(duì)象的目錄結(jié)構(gòu)如下圖
網(wǎng)絡(luò)通訊部分采用完成端口模式,通訊數(shù)據(jù)采用封裝數(shù)據(jù)對(duì)象XVarArray,該對(duì)象支持基本數(shù)據(jù)類型int int64 bytes long float char *,該對(duì)象常用函數(shù)如下:
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);//設(shè)置到第幾個(gè)元素
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);
封裝的遠(yuǎn)程對(duì)象基類,方便編寫遠(yuǎn)程對(duì)象
#include "..\\include\\XNetEvent.h"
typedef map<string,XNetEvent *>XNetEventType;//對(duì)象的所有事件
class AFX_EXT_CLASS XOneObject
{
public:
void GetEvents(CStringArray &m_EventArray);
void DebugObj(char *pStr);
void *pXOneApp;
bool bDIYEvent;//自定義觸發(fā)事件
void InitPack();
virtual void RemoveSOCKET(SOCKET s);//一個(gè)SOCKET 掉線
void RemoveSEvent(SOCKET s);
HANDLE hNet;
DWORD pBasePack;//公有對(duì)象使用同一個(gè),私有對(duì)象擁有獨(dú)立連接的
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;
};
派生該基類實(shí)現(xiàn)遠(yuǎn)程對(duì)象如:
class XShareObjectNO2:public XOneObject
{
public:
//典型的對(duì)象函數(shù) 參數(shù)s:網(wǎng)絡(luò)連接SOCKET ,InVarArray:輸入?yún)?shù):OutVarArray:輸出參數(shù),bClose:返會(huì)true表示斷開(kāi)連接,nThreadNO:表示在服務(wù)端低幾個(gè)線程調(diào)用
bool JsonFunction(SOCKET s,XVarArray &InVarArray, XVarArray &OutVarArray,bool &bClose,DWORD &dwObject,int nThreadNO);
void InitObjEvent();//初始化對(duì)象事件
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();//初始化對(duì)象基本參數(shù)
XShareObjectNO2();
virtual ~XShareObjectNO2();
};
實(shí)現(xiàn)類:
XShareObjectNO2::XShareObjectNO2()
{
}
XShareObjectNO2::~XShareObjectNO2()
{
}
void XShareObjectNO2::InitObject()
{MyFunc
PushFuncName("MyFunc",static_cast<XOneObject::pCLASSFUNC>(&XShareObjectNO2::MyFunc));//初始對(duì)象函數(shù)MyFunc指向函數(shù)MyFunc
PushFuncName("AddStr",static_cast<XOneObject::pCLASSFUNC>(&XShareObjectNO2::AddStr));//初始對(duì)象函數(shù)AddStr指向函數(shù)AddStr
PushFuncName("JsonFunction",static_cast<XOneObject::pCLASSFUNC>(&XShareObjectNO2::JsonFunction));//初始對(duì)象函數(shù)AddStr指向函數(shù)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 事件觸發(fā)的消息");
PostEvent("DataChange",m_XVarArray0);//觸發(fā)DataChange事件
return true;
}
void XShareObjectNO2::InitObjEvent()
{
AddOneEvent("DataChange");//初始化對(duì)象事件DataChange
AddOneEvent("JsonEvent");//初始化對(duì)象事件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;
}
對(duì)象dll裝載公有輸出函數(shù)如:
extern DWORD WINAPI GetOneObject(char *sObjectName)//獲得指定名稱的遠(yuǎn)程對(duì)象
{
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)//獲得當(dāng)前dll中包含哪些遠(yuǎn)程對(duì)象名
{
ObjectNameArray.RemoveAll();
ObjectNameArray.Add("XShareObjectNO1");
ObjectNameArray.Add("XShareObjectNO2");
return true;
}
extern bool WINAPI GetOneObjectAllFuncName(DWORD pXOneObject,CStringArray &ObjectFunNameArray) //返回對(duì)象包含的函數(shù)名
{
XOneObject *pXOneObject0=(XOneObject *)pXOneObject;
pXOneObject0->GetAllFuncNameArray(ObjectFunNameArray);
return true;
}
為方便客戶端調(diào)用,封裝客戶端調(diào)用框架,目前支持的VC C# Java的客戶端調(diào)用
以VC客戶端為例
class AFX_EXT_CLASS XClientNetCtrl
{
public:
void CloseOneNet(char *sAppName);//關(guān)閉一個(gè)遠(yuǎn)程應(yīng)用
bool CallShareObjectFunc(XClientShareObject *pXClientShareObject,char *sFName,XVarArray &m_VarArray,XVarArray *pOutXVarArray=NULL);//調(diào)用遠(yuǎn)程對(duì)象方法
XClientShareObject * GetOneNetShareObject(char *sAppName,char *sShareObjectName,bool bPerson=false);//獲得一個(gè)遠(yuǎn)程對(duì)象 sAppName:應(yīng)用名 sShareObjectName:對(duì)象名
bool GetOneAppNet(char *sIP,UINT nPort,char *sAppName,pRUNCLASSFUNC pExitNet=NULL,DWORD pXRunShareObjectBase=0);//獲得一個(gè)應(yīng)用
XClientOneNetArray m_XClientOneNetArray;
XClientOneNetFromNameArray m_XClientOneNetFromNameArray;
XClientNetCtrl();
virtual ~XClientNetCtrl();
};
class AFX_EXT_CLASS XClientShareObject //客戶端對(duì)象的基類
{
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);//執(zhí)行運(yùn)行函數(shù),如果要等待結(jié)果那么就要賦pOutXVarArray,如果不用等待只是用結(jié)果事件那么不用賦值;
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();
};
客戶端調(diào)用的例子
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);//連接服務(wù)器
pXShareObject1=m_XClientNetCtrl.GetOneNetShareObject("game","XShareObjectNO1",true);//獲得遠(yuǎn)程對(duì)象XShareObjectNO1
pXShareObject1->AttachXNetFuncReult("NO2Func",(DWORD)this,static_cast<pRUNCLASSFUNC>(&CNetRunDlg::OBFuncResult));//綁定遠(yuǎn)程序?qū)ο骕ShareObjectNO1函數(shù)NO2Func返回函數(shù)
pXShareObject1->AttachXNetEvent("DataChange",(DWORD)this,static_cast<pRUNCLASSFUNC>(&CNetRunDlg::OBEventResult));//綁定遠(yuǎn)程序?qū)ο骕ShareObjectNO1事件函數(shù)DataChange
pXShareObject2=m_XClientNetCtrl.GetOneNetShareObject("game","XShareObjectNO2",true);//獲得遠(yuǎn)程對(duì)象XShareObjectNO2
pXShareObject2->AttachXNetFuncReult("AddStr",(DWORD)this,static_cast<pRUNCLASSFUNC>(&CNetRunDlg::OBFuncResult));//綁定遠(yuǎn)程序?qū)ο骕ShareObjectNO2函數(shù)NO2Func返回函數(shù)
pXShareObject2->AttachXNetEvent("DataChange",(DWORD)this,static_cast<pRUNCLASSFUNC>(&CNetRunDlg::OBEventResult));//綁定遠(yuǎn)程序?qū)ο骕ShareObjectNO2事件函數(shù)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:執(zhí)行的函數(shù),OutXVarArray返回的結(jié)果
{
CNetRunDlg *pNetRunDlg=(CNetRunDlg *)pThis;
}
void CNetRunDlg::OBEventResult(XClientShareObject *pXClientShareObject, char *sEventName, XVarArray &OutXVarArray, DWORD pThis)//*sEventName:返回的事件,OutXVarArray返回的結(jié)果
{
CNetRunDlg *pNetRunDlg=(CNetRunDlg *)pThis;
char TStr[100];
int L;
OutXVarArray.ReadStr(TStr,L);
TStr[L]=0;
AfxMessageBox(TStr);
}
XShareObjectNO2調(diào)用函數(shù)
XVarArray m_XVarArray,m_XOutVarArray;
m_XVarArray.WriteStr("中國(guó)");
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");
基于該遠(yuǎn)程對(duì)象實(shí)現(xiàn)一個(gè)類QQ的聊天工具PCEQ,實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)聊天,群聊,文件傳輸,遠(yuǎn)程協(xié)助,語(yǔ)音聊天,視頻聊天等常用功能
如今消息生產(chǎn)消費(fèi)訂閱已經(jīng)有不少成熟的開(kāi)發(fā)包可調(diào)用,而那些年你也是否自己造了一大堆輪子呢?
以上就是關(guān)于pos機(jī)遠(yuǎn)程刷卡步驟,VC實(shí)現(xiàn)遠(yuǎn)程對(duì)象函數(shù)調(diào)用的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)遠(yuǎn)程刷卡步驟的知識(shí),希望能夠幫助到大家!
![](/style/images/zhouzong.jpg)