客户有个条形码扫描的机器,是symbol公司提供的一个设备
• 操作系统:Microsoft Windows CE .NET 4.2 Core
• 内存配置:32 MB RAM/32 MB 闪存
• 屏幕:单色240 x 240 像素, 2.2 英寸对角线,非触摸屏
• 扩展槽:用户可操作的Secure Digital (SD) 卡插槽
• 键盘:21 键键盘
• 数据采集:一维条码激光扫描
他们提供一个开发包sdk供开发操作条形码,具体函数如下:
SCAN_AllocateBuffer 分配缓存
SCAN_DeallocateBuffer 回收缓存
SCAN_FindFirst 查询第一个可用的扫描设备
SCAN_FindNext 查询下一个可用的扫描设备
SCAN_FindClose; 关闭被查询到的扫描设备
SCAN_Open 打开一个指定的扫描设备
SCAN_GetVersionInfo 获得版本信息
SCAN_Close 关闭一个指定的扫描设备
SCAN_Enable 扫描器能动扫描
SCAN_Disable 扫描器不能动扫描
SCAN_ReadLabelEvent 提交阅读事件
SCAN_ReadLabelMsg 提交阅读消息
SCAN_ReadLabelWait 提交阅读等待
SCAN_CancelRead 取消一个阅读(未完成的阅读)
SCAN_Flush 关闭所有的阅读
SCAN_GetSoftTrigger 获得软触动标志
SCAN_SetSoftTrigger 设置触动标志
SCAN_GetDeviceInfo 获得设备能力
SCAN_GetSupportedDecoders 获得支持的解码器列表
SCAN_GetEnabledDecoders 获得能用的解码器列表
SCAN_SetEnabledDecoders 设置能用的解码器列表
SCAN_GetDecoderParams 获得解码器参数
SCAN_SetDecoderParams 设置解码器参数
SCAN_GetUPCEANParams
SCAN_SetUPCEANParams
SCAN_GetReaderParams 获得阅读参数
SCAN_SetReaderParams 设置阅读参数
SCAN_GetInterfaceParams 获得接口参数
SCAN_SetInterfaceParams 设置接口参数
SCAN_GetScanParameters 获得扫描参数
SCAN_SetScanParameters 设置扫描参数
SCAN_GetScanStatus 获得扫描状态
SCAN_RegisterScanMessage 注册扫描信息
SCAN_DeregisterScanMessage 撤销扫描信息
SCAN_DoRemoteFeedback
SCAN_Ioctl
注意:
SCAN_ReadLabelMsg可以出发消息,整个过程是消息驱动的,所以需要用到EVC中的Message事件。
条形码扫描+SQLCE数据库远程访问
LRESULT CALLBACK ScanProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
DWORD dwResult;
TCHAR szMsgBuf[256];
LPSCAN_BUFFER lpScanBuf;
HWND hctl_data;
ISSCERDA* pCERDA = NULL;
BSTR bStr = NULL;
BSTR bConnectStr = NULL;
BSTR bQueryStr = NULL;
switch(message)
{
case WM_INITDIALOG:
{
dwResult = SCAN_Open(szScannerName, &hScanner);
if ( dwResult != E_SCN_SUCCESS )
{
ErrorExit(hDlg, IDS_FAILURE, TEXT("SCAN_Open"));
break;
}
dwResult = SCAN_Enable(hScanner);
if ( dwResult != E_SCN_SUCCESS )
{
ErrorExit(hDlg, IDS_FAILURE, TEXT("SCAN_Enable"));
break;
}
lpScanBuffer = SCAN_AllocateBuffer(bUseText, dwScanSize);
if (lpScanBuffer == NULL)
{
ErrorExit(hDlg, IDS_FAILURE, TEXT("SCAN_AllocateBuffer"));
return TRUE;
}
dwResult = SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hDlg,
UM_SCAN,
dwScanTimeout,
NULL);
if ( dwResult != E_SCN_SUCCESS )
ErrorExit(hDlg, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
GetPrivateProfileString(_T("SQLCE"),_T("IP"),_T("127.0.0.1"),szSqlceIP,128,_T(".\\Config.ini"));
GetPrivateProfileString(_T("SQL"),_T("IP"),_T("127.0.0.1"),szSqlIP,128,_T(".\\Config.ini"));
GetPrivateProfileString(_T("SQL"),_T("UID"),_T("sa"),szSqlUID,128,_T(".\\Config.ini"));
GetPrivateProfileString(_T("SQL"),_T("PWD"),_T("tendency"),szSqlPWD,128,_T(".\\Config.ini"));
}
break;
case UM_SCAN:
{
bRequestPending = FALSE;
bTriggerFlag = FALSE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag);
lpScanBuf = (LPSCAN_BUFFER)lParam;
if ( lpScanBuf == NULL )
ErrorExit(hDlg, IDS_ERR_BUF, 0);
hctl_data = GetDlgItem(hDlg,IDC_EDIT_SCAN);
switch (SCNBUF_GETSTAT(lpScanBuf))
{
case E_SCN_DEVICEFAILURE:
SetWindowText(hctl_data, LoadMsg(IDS_DEVICE_FAILURE,
szMsgBuf, sizeof(szMsgBuf)/sizeof(szMsgBuf[0])));
break;
case E_SCN_READPENDING:
SetWindowText(hctl_data, LoadMsg(IDS_READ_PENDING,
szMsgBuf, sizeof(szMsgBuf)/sizeof(szMsgBuf[0])));
break;
case E_SCN_READCANCELLED:
if (bStopScanning)
{
SendMessage(hDlg,UM_STOPSCANNING,0,0L);
return TRUE;
}
if (!GetFocus())
break;
SetWindowText(hctl_data, LoadMsg(IDS_READ_CANCELLED,
szMsgBuf, sizeof(szMsgBuf)/sizeof(szMsgBuf[0])));
break;
case E_SCN_READTIMEOUT:
if(bContinuousMode)
PostMessage(hDlg,WM_COMMAND,IDC_BTN_SCAN,0L);
break;
case E_SCN_SUCCESS:
SetWindowText(hctl_data, (LPTSTR)SCNBUF_GETDATA(lpScanBuffer));
if(bContinuousMode)
PostMessage(hDlg,WM_COMMAND,IDC_BTN_SCAN,0L);
break;
}
if (GetFocus())
{
dwResult = SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hDlg,
message,
dwScanTimeout,
NULL);
if ( dwResult != E_SCN_SUCCESS )
ErrorExit(hDlg, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
}
return TRUE;
}
case UM_STOPSCANNING:
{
if (!bStopScanning && bRequestPending)
SCAN_Flush(hScanner);
if (!bRequestPending)
{
SCAN_Disable(hScanner);
if (lpScanBuffer)
SCAN_DeallocateBuffer(lpScanBuffer);
SCAN_Close(hScanner);
EndDialog(hDlg, 0);
}
bStopScanning = TRUE;
return TRUE;
}
case WM_ACTIVATE:
{
switch(LOWORD(wParam))
{
case WA_INACTIVE:
hctl_data = GetDlgItem(hDlg,IDC_EDIT_SCAN);
SetWindowText(hctl_data, LoadMsg(IDS_INACTIVE, szMsgBuf, sizeof(szMsgBuf)/sizeof(szMsgBuf[0])));
if (bRequestPending)
dwResult = SCAN_Flush(hScanner);
break;
default:
hctl_data = GetDlgItem(hDlg,IDC_EDIT_SCAN);
SetWindowText(hctl_data, LoadMsg(IDS_READY, szMsgBuf, sizeof(szMsgBuf)/sizeof(szMsgBuf[0])));
if (!bRequestPending && lpScanBuffer != NULL && !bStopScanning)
{
dwResult = SCAN_ReadLabelMsg(hScanner, lpScanBuffer, hDlg, UM_SCAN, dwScanTimeout, NULL);
if ( dwResult != E_SCN_SUCCESS )
ErrorExit(hDlg, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
}
break;
}
}break;
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_BTN_SCAN://扫描
{
bTriggerFlag = FALSE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag);
bTriggerFlag = TRUE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag);
}
break;
case IDC_BTN_SAVE://保存
{
TCHAR buffer[128];
hctl_data = GetDlgItem(hDlg,IDC_EDIT_SCAN);
if(GetWindowText(hctl_data, buffer, dwScanSize) == 0)
return FALSE;
PBYTE pFileBuf;
pFileBuf = new BYTE[128]; //分配缓冲区
memset(pFileBuf,0,128);
CFile file;
file.Open(lpFileName, CFile::modeRead);
ASSERT(file != NULL);
file.Read((void *)pFileBuf,126);
file.Close();
TCHAR WideChar[126];
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pFileBuf, 126, WideChar, 126);
delete [] pFileBuf;
//--------------//
CoInitialize();
HRESULT hr = CoCreateInstance(CLSID_RemoteDataAccess, NULL, CLSCTX_INPROC_SERVER, IID_ISSCERDA, (LPVOID *)&pCERDA);
ASSERT(hr == S_OK);
ASSERT(pCERDA != NULL);
TCHAR sqlIP[128];
_tcscpy(sqlIP,_T("http://"));
_tcscat(sqlIP,szSqlceIP);
_tcscat(sqlIP,_T("/sqlce/sscesa20.dll"));
bStr = sqlIP;
pCERDA->put_InternetURL(bStr);
bStr = SysAllocString(_T("Administrator"));
pCERDA->put_InternetLogin(bStr);
SysFreeString(bStr);
bStr = SysAllocString(_T("9614188"));
pCERDA->put_InternetPassword(bStr);
SysFreeString(bStr);
TCHAR sql[256];
_tcscpy(sql,_T("Provider=sqloledb;Data Source="));
_tcscat(sql,szSqlIP);
_tcscat(sql,_T(";Initial Catalog=WMS;User Id="));
_tcscat(sql,szSqlUID);
_tcscat(sql,_T(";Password="));
_tcscat(sql,szSqlPWD);
bConnectStr = sql;
TCHAR sqlinfo[256];
_tcscpy(sqlinfo,_T("INSERT INTO T_ScanData(NoteNo,BarCode) VALUES('"));
_tcscat(sqlinfo,WideChar);
_tcscat(sqlinfo,_T("','"));
_tcscat(sqlinfo,buffer);
_tcscat(sqlinfo,_T("')"));
bQueryStr = sqlinfo;
hr = pCERDA->SubmitSQL(bQueryStr,bConnectStr);
if (FAILED(hr))
{
ISSCEErrors *pISSCEErrors = NULL;
if(SUCCEEDED(hr = pCERDA->get_ErrorRecords(&pISSCEErrors)))
{
ShowErrors(pISSCEErrors);
pISSCEErrors->Release();
}
}
else
{
MessageBox(hDlg,_T("保存成功!"),_T("提示"),MB_OK);
}
pCERDA->Release();
CoUninitialize();
//--------------//
}
break;
case IDC_BTN_SET://设置
{
DialogBox(hInst, (LPCTSTR)IDD_DLG_SET, hDlg, (DLGPROC)SetSQL);
}
break;
case IDCANCEL:
SendMessage(hDlg,UM_STOPSCANNING,0,0L);
break;
}
return TRUE;
}
}
return FALSE;
}