现在来看看我的源程序吧!
// PosCtrl.cpp : Implementation of CPosCtrl
#include "stdafx.h"
#include "PosActiveX.h"
#include "PosCtrl.h"
//--------------------------------------------------------
// Police.dll所用到的常量定义
//--------------------------------------------------------
#define Com_UpRecord 1
#define Com_UpPoliceLen 2
#define Com_UpSimpleDataLen 3
#define Com_UpSimplePunishLen 4
#define Com_UpGeneralDataLen 5
#define Com_UpGeneralPunishLen 6
#define Com_EmptyPolice 7
#define Com_EmptySimpleData 8
#define Com_EmptySimplePunish 9
#define Com_EmptyGeneralData 10
#define Com_EmptyGeneralPunish 11
#define Com_DownRecord 0x80
#define Com_DownStreetCodeLen 0x81
#define Com_DownBlackListLen 0x82
#define Com_DownPeccancySimpleLen 0x83
#define Com_DownPeccancyGeneralLen 0x84
#define Com_DownDateTime 0x85
#define Com_Exit 0x86
#define Com_Init 0x87
#define Err_UpSimpleDataLen 0
#define Err_UpSimplePunishLen 1
#define Err_UpGeneralDataLen 2
#define Err_UpGeneralPunishLen 3
#define Err_UpPoliceLen 4
#define Err_UpRecord 5
#define Err_DownStreetCodeLen 6
#define Err_DownSimplePeccancyCodeLen 7
#define Err_DownGeneralPeccancyCodeLen 8
#define Err_DownBlackList 9
#define Err_DownDateTime 10
#define Err_EmptyData 11
#define Err_GetCode 12;
#define Const_Terminator 0x20
#pragma data_seg("mydata")
static HINSTANCE DLLInst = NULL; //动态库句柄
#pragma data_seg() //
HANDLE hCom; //COM串口句柄
//------------------------------------------------------
//POLICE.DLL动态库函数功能定义
//------------------------------------------------------
HANDLE (__stdcall *Init_comm)(LPSTR str);//初始化通信口
BYTE (__stdcall *Exit)(HANDLE hCom);//关闭通信口
BYTE (__stdcall *Protocol)(HANDLE hCom,BYTE cmd,BYTE len,BYTE *_dt,BYTE *prlen,BYTE *prdt);//通信协议
BYTE (__stdcall *Pipe_control)(HANDLE hCom,BYTE mode);//多路控制typedef
BYTE (__stdcall *Dev_escape)(HANDLE hCom);//断开多路控制
//----------------------------------------------------------------------------//
// 功能:加载Police.dll动态库和其中的一些功能函数
// 输入/输出参数:无
// 版本:1.0
// 修改:
//----------------------------------------------------------------------------// void CPosCtrl::InitDll()
{
DLLInst=LoadLibrary("police.dll");
if(DLLInst!=NULL)
{
Init_comm=(HANDLE(__stdcall *)(LPSTR))GetProcAddress(DLLInst,"Init_comm");
Exit=(BYTE(__stdcall *)(HANDLE))(GetProcAddress(DLLInst,"Exit"));
Protocol=(BYTE(__stdcall *)(HANDLE,BYTE,BYTE,BYTE *_dt,BYTE *prlen,BYTE *prdt))(GetProcAddress(DLLInst,"Protocol"));
Pipe_control=(BYTE(__stdcall *)(HANDLE,BYTE))(GetProcAddress(DLLInst,"Pipe_control"));
Dev_escape=(BYTE(__stdcall *)(HANDLE))(GetProcAddress(DLLInst,"Dev_escape"));
}
else
{
::MessageBox(NULL,"加载动态库失败!", "提示信息", MB_OK | MB_ICONINFORMATION);
exit(0);
}
}
//----------------------------------------------------------------------------//
// 功能:释放动态库
// 输入/输出参数:无
// 版本:1.0
// 修改:
//----------------------------------------------------------------------------// void CPosCtrl::ExitDll()
{
if(DLLInst!=NULL)
FreeLibrary(DLLInst);
}
//----------------------------------------------------------------------------//
// 功能:控件接口方法,对外提供关闭串口,释放动态库。
// 输入/输出参数:无 // 版本:1.0
// 修改:
//----------------------------------------------------------------------------// STDMETHODIMP CPosCtrl::Quit()
{
// TODO: Add your implementation code here
(*Exit)(hCom);
ExitDll();
::MessageBox(NULL,"关闭COM口成功","提示信息",MB_OK | MB_ICONINFORMATION);
return S_OK;
}
STDMETHODIMP CPosCtrl::get_ComNo(short *pVal)
{
// TODO: Add your implementation code here
*pVal = m_ComNo;
return S_OK;
}
STDMETHODIMP CPosCtrl::put_ComNo(short newVal)
{
// TODO: Add your implementation code here
m_ComNo = newVal;
return S_OK;
}
//----------------------------------------------------------------------------//
// 功能:提供初化动态库的对外接口,并实现打开口串口的功能。
// 输入/输出参数:11--要打开的串口号。
// 版本:1.0
// 修改:
//----------------------------------------------------------------------------// STDMETHODIMP CPosCtrl::Init(short nComNo)
{
// TODO: Add your implementation code here
InitDll();
char str[20] = "";
sprintf(str,"COM%d",nComNo);
hCom = (*Init_comm)((LPSTR)str);
sprintf(str,"%d",hCom);
char temp[255] = "";
strcpy(temp,"打开的端口为COM1,句柄为:");
strcat(temp,str);
::MessageBox(NULL,temp,"提示信息",MB_OK | MB_ICONINFORMATION);
//TCHAR str[255];
//sprintf(str,"%d",hCom);
//MessageBox(str,"Caption",MB_OK);
return S_OK;
}
//----------------------------------------------------------------------------//
// 功能:实现ASCII码到BCD码的转换功能函数
// 输入/输出参数:11-想转换的ASCII码,22-返回的BCD码,13-ASCII码的长度,14-返回的BCD码长度
// 版本:1.0
// 修改:
//----------------------------------------------------------------------------// void CPosCtrl::ASCII_TO_BCD(char *cSource, char *cResult, int iSourceLen, int iResultLen)
{
int iBegin,i;
iBegin=0;
if(iSourceLen%2)
{
iBegin=1;
cResult[0]=cSource[0]-''0'';
}
for (i=iBegin;i {
cResult=(cSource[2*i-iBegin]-''0'')*16 cSource[2*i-iBegin 1]-''0'';
}
//deprive off preData
cResult[iResultLen]=''\0'';
}
//----------------------------------------------------------------------------//
// 功能:设置POS机时间函数。
// 输入/输出参数:11-想要设置的时间
// 版本:1.0
// 修改:
//----------------------------------------------------------------------------// BOOL CPosCtrl::SetPosDateTime(char * pchDateTime)
{
int n=1;
unsigned char cInput[257],cOutput[256];
BYTE byOutput,retVal;
for(int i=0;i<8;i )
{
(*Pipe_control)(hCom,n); //多路控制
//修改POS机时间
{
if(::MessageBox(NULL,"是否确定修改POS机时间?","提示信息",MB_YESNO)==IDNO)
{
return FALSE;
}
ASCII_TO_BCD(pchDateTime,(char *)cInput,10,5);
retVal = (*Protocol)(hCom,Com_DownDateTime,5,cInput,