www.pudn.com > PosActiveX.rar > PosCtrl.cpp


// PosCtrl.cpp : Implementation of CPosCtrl 
 
#include "stdafx.h" 
#include "PosActiveX.h" 
#include "PosCtrl.h" 
 
///////////////////////////////////////////////////////////////////////////// 
// CPosCtrl 
 
///////////////////////////////////////////////////////////////////////////// 
// 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()                      //与#pragma data_seg("mydata") 首尾呼应表示该数据段的结束。 
 
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);//断开多路控制 
 
///////////////////////////////////////////////////////////////////////////// 
// CPosCtrl 
 
//----------------------------------------------------------------------------// 
// 功能:调用POLICE.DLL动态库和其中的一些功能函数。 
// 输入/输出参数:无 
// 返回值类型: 
// 修改: 
//----------------------------------------------------------------------------// 
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); 
	} 
} 
 
 
//----------------------------------------------------------------------------// 
// 功能:释放动态库 
// 输入/输出参数:无 
// 返回值类型: 
// 修改: 
//----------------------------------------------------------------------------// 
void CPosCtrl::ExitDll() 
{ 
	if(DLLInst!=NULL) 
     FreeLibrary(DLLInst); 
} 
 
 
//----------------------------------------------------------------------------// 
// 功能:控件接口的方法,完成关闭串口,释放动态库的对外开放的方法 
// 输入/输出参数: 
// 返回值类型: 
// 修改: 
//----------------------------------------------------------------------------// 
STDMETHODIMP CPosCtrl::Quit() 
{ 
	// TODO: Add your implementation code here 
	//MessageBox("方法调用了一点!","提示信息",MB_OK); 
	(*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; 
} 
 
 
//----------------------------------------------------------------------------// 
// 功能:接口方法,完成调用动态库功能,此方法对外开放 
// 输入/输出参数: 
// 返回值类型: 
// 修改: 
//----------------------------------------------------------------------------// 
STDMETHODIMP CPosCtrl::Init(short nComNo) 
{ 
 	// TODO: Add your implementation code here 
	//MessageBox("方法调用了一点!","提示信息",MB_OK); 
	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-源的字节长,14-目的的长度 
// 返回值类型: 
// 修改: 
//----------------------------------------------------------------------------// 
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