我使用VC++.net开发一个掌上电脑小程序,使用了以上函数,想实现的功能是不停的可以用PDA扫描条码,使用以上函数有这个的问题:
有一打开扫描头的时间不定,打开程序可扫描的时间有长有短。还有很容易程序就死机了,重启,比如打开程序都一会儿,不作什么操作,它都会自动死机;
程序大致如下:BOOL CNMS_WHScan_OutCar::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
#if defined(HAVE_SCANNER)
// 初始化 Scanner
UM_init();
#endif return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
#if defined(HAVE_SCANNER)
void CNMS_WHScan_OutCar::UM_init()
{
hInst = NULL;
hScanner = NULL;
lpScanBuffer = NULL;
memset(szScannerName, 0, MAX_PATH);
lstrcpy(szScannerName, TEXT("SCN1:")); // default scanner name
dwScanSize = 7095; // default scan buffer size
dwScanTimeout = 2000; // default timeout value (0 means no timeout)
bUseText = TRUE;
bTriggerFlag = FALSE;
bRequestPending = FALSE;
bStopScanning = FALSE;
bContinuousMode = FALSE;
// UM_startScanning();
::PostMessage(m_hWnd, UM_STARTSCANNING, 0, 0L);
}void CNMS_WHScan_OutCar::UM_errorExit(HWND hwnd, UINT uID, LPTSTR szFunc)
{
TCHAR szMsg[256];
TCHAR szBuf[256]; if (szFunc == NULL)
wcscpy(szMsg, UM_loadMsg(uID, szBuf, countof(szBuf)));
else
wsprintf(szMsg, TEXT("%s %s"), szFunc,
UM_loadMsg(uID, szBuf, countof(szBuf)));
//::MessageBox(NULL, szMsg, NULL, MB_OK);
::PostMessage(m_hWnd,UM_STOPSCANNING,0,0L);
}void CNMS_WHScan_OutCar::UN_stopScanning()
{
if (!bStopScanning && bRequestPending)
SCAN_Flush(hScanner); if (!bRequestPending)
{
SCAN_Disable(hScanner); if (lpScanBuffer)
SCAN_DeallocateBuffer(lpScanBuffer); SCAN_Close(hScanner); ::EndDialog(UM_hwnd, 0);
}
bStopScanning = TRUE;
}BOOL CNMS_WHScan_OutCar::PreTranslateMessage(MSG *pMsg)
{
if(pMsg->message==WM_INITDIALOG||pMsg->message==UM_STARTSCANNING||pMsg->message==UM_STOPSCANNING||pMsg->message==WM_ACTIVATE||pMsg->message==UM_SCAN||pMsg->message==WM_ACTIVATE||(pMsg->message==WM_ACTIVATE==WM_COMMAND&&(pMsg->wParam==IDC_BUTTON_SOFTTRIGGER||pMsg->wParam==IDC_CONTINUOUS||pMsg->wParam==IDCANCEL))
{
BasicScanProc(pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam);
return CDialog::PreTranslateMessage(pMsg);
}
else
{
return TRUE;
}
}LPTSTR CNMS_WHScan_OutCar::UM_loadMsg(UINT uID, LPTSTR lpBuffer, int nBufSize)
{
if (!LoadString(hInst, uID, lpBuffer, nBufSize))
wcscpy(lpBuffer, TEXT(""));
//UN_stopScanning();
return lpBuffer;
}
#endifLRESULT CALLBACK CNMS_WHScan_OutCar::BasicScanProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
DWORD dwResult;
TCHAR szMsgBuf[256];
LPSCAN_BUFFER lpScanBuf;
HWND hctl_data; switch(uMsg)
{
case WM_INITDIALOG: ::PostMessage(hwnd,UM_STARTSCANNING,0,0L);
break; case UM_STARTSCANNING:
dwResult = SCAN_Open(szScannerName, &hScanner);
if ( dwResult != E_SCN_SUCCESS )
{
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_Open"));
break;
} dwResult = SCAN_Enable(hScanner);
if ( dwResult != E_SCN_SUCCESS )
{
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_Enable"));
break;
} lpScanBuffer = SCAN_AllocateBuffer(bUseText, dwScanSize);
if (lpScanBuffer == NULL)
{
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_AllocateBuffer"));
return TRUE;
} dwResult = SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hwnd,
UM_SCAN,
500,
NULL);
if ( dwResult != E_SCN_SUCCESS )
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
break;
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(hwnd, 0);
}
bStopScanning = TRUE; return TRUE; case WM_ACTIVATE:
switch(LOWORD(wParam))
{
case WA_INACTIVE:
hctl_data = ::GetDlgItem(hwnd,IDC_EDIT_DATA);
::Edit_SetText(hctl_data, UM_loadMsg(IDS_INACTIVE,szMsgBuf, countof(szMsgBuf)));
if (bRequestPending)
dwResult = SCAN_Flush(hScanner);
break;
default: // activating
hctl_data = ::GetDlgItem(hwnd,IDC_EDIT_DATA);
::Edit_SetText(hctl_data, UM_loadMsg(IDS_READY,szMsgBuf, countof(szMsgBuf))); if (!bRequestPending && lpScanBuffer != NULL && !bStopScanning)
{
dwResult = SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hwnd,
UM_SCAN,
dwScanTimeout,
NULL);
if ( dwResult != E_SCN_SUCCESS )
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
}
break;
}
break; case UM_SCAN: bRequestPending = FALSE; // Clear the soft trigger
bTriggerFlag = FALSE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag); // Get scan result from the scan buffer, and display it
lpScanBuf = (LPSCAN_BUFFER)lParam;
if ( lpScanBuf == NULL )
UM_errorExit(UM_hwnd, IDS_ERR_BUF, 0); hctl_data = ::GetDlgItem(hwnd,IDC_EDIT_DATA); switch (SCNBUF_GETSTAT(lpScanBuf))
{
case E_SCN_DEVICEFAILURE:
::Edit_SetText(hctl_data, UM_loadMsg(IDS_DEVICE_FAILURE,szMsgBuf, countof(szMsgBuf)));
break; case E_SCN_READPENDING:
::Edit_SetText(hctl_data, UM_loadMsg(IDS_READ_PENDING,szMsgBuf, countof(szMsgBuf)));
break; case E_SCN_READCANCELLED: if (bStopScanning)
{ // complete the second step of UM_STOPSCANNING
::SendMessage(hwnd, UM_STOPSCANNING, 0, 0L);
return TRUE;
}
if (!GetFocus())
break; // Do nothing if read was cancelled while deactivation ::Edit_SetText(hctl_data, UM_loadMsg(IDS_READ_PENDING,szMsgBuf, countof(szMsgBuf)));
break; case E_SCN_READTIMEOUT:
if(bContinuousMode)
::PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break;
case E_SCN_SUCCESS:
::Edit_SetText(hctl_data, (LPTSTR)SCNBUF_GETDATA(lpScanBuffer)); CString BTempStr=_T("");
m_WHSOutCar_Barcode.GetWindowTextW(BTempStr);
if(sizeof(lpScanBuffer)>0&&BTempStr.Compare(_T("■■■■■■■■"))!=0)
{
m_WHSOutCar_Barcode.SetWindowTextW((LPTSTR)SCNBUF_GETDATA(lpScanBuffer));
OnBnClickedWhsoutcarSave();//保存入库信息
} if(bContinuousMode)
::PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break;
} if (GetFocus())
{
dwResult = SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hwnd,
uMsg,
dwScanTimeout,
NULL);
if ( dwResult != E_SCN_SUCCESS )
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
} return TRUE; case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BUTTON_SOFTTRIGGER:
// Clear the state first before we set it to TRUE
bTriggerFlag = FALSE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag); bTriggerFlag = TRUE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag); break;
case IDC_CONTINUOUS: //Check for Continuous Scan Mode
bContinuousMode = !bContinuousMode;
if(bContinuousMode)
::PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break; case IDOK: // fall through case IDCANCEL:
::SendMessage(hwnd,UM_STOPSCANNING,0,0L);
break;
}
return TRUE;
}
//return FALSE;
return TRUE;
}
有一打开扫描头的时间不定,打开程序可扫描的时间有长有短。还有很容易程序就死机了,重启,比如打开程序都一会儿,不作什么操作,它都会自动死机;
程序大致如下:BOOL CNMS_WHScan_OutCar::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
#if defined(HAVE_SCANNER)
// 初始化 Scanner
UM_init();
#endif return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
#if defined(HAVE_SCANNER)
void CNMS_WHScan_OutCar::UM_init()
{
hInst = NULL;
hScanner = NULL;
lpScanBuffer = NULL;
memset(szScannerName, 0, MAX_PATH);
lstrcpy(szScannerName, TEXT("SCN1:")); // default scanner name
dwScanSize = 7095; // default scan buffer size
dwScanTimeout = 2000; // default timeout value (0 means no timeout)
bUseText = TRUE;
bTriggerFlag = FALSE;
bRequestPending = FALSE;
bStopScanning = FALSE;
bContinuousMode = FALSE;
// UM_startScanning();
::PostMessage(m_hWnd, UM_STARTSCANNING, 0, 0L);
}void CNMS_WHScan_OutCar::UM_errorExit(HWND hwnd, UINT uID, LPTSTR szFunc)
{
TCHAR szMsg[256];
TCHAR szBuf[256]; if (szFunc == NULL)
wcscpy(szMsg, UM_loadMsg(uID, szBuf, countof(szBuf)));
else
wsprintf(szMsg, TEXT("%s %s"), szFunc,
UM_loadMsg(uID, szBuf, countof(szBuf)));
//::MessageBox(NULL, szMsg, NULL, MB_OK);
::PostMessage(m_hWnd,UM_STOPSCANNING,0,0L);
}void CNMS_WHScan_OutCar::UN_stopScanning()
{
if (!bStopScanning && bRequestPending)
SCAN_Flush(hScanner); if (!bRequestPending)
{
SCAN_Disable(hScanner); if (lpScanBuffer)
SCAN_DeallocateBuffer(lpScanBuffer); SCAN_Close(hScanner); ::EndDialog(UM_hwnd, 0);
}
bStopScanning = TRUE;
}BOOL CNMS_WHScan_OutCar::PreTranslateMessage(MSG *pMsg)
{
if(pMsg->message==WM_INITDIALOG||pMsg->message==UM_STARTSCANNING||pMsg->message==UM_STOPSCANNING||pMsg->message==WM_ACTIVATE||pMsg->message==UM_SCAN||pMsg->message==WM_ACTIVATE||(pMsg->message==WM_ACTIVATE==WM_COMMAND&&(pMsg->wParam==IDC_BUTTON_SOFTTRIGGER||pMsg->wParam==IDC_CONTINUOUS||pMsg->wParam==IDCANCEL))
{
BasicScanProc(pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam);
return CDialog::PreTranslateMessage(pMsg);
}
else
{
return TRUE;
}
}LPTSTR CNMS_WHScan_OutCar::UM_loadMsg(UINT uID, LPTSTR lpBuffer, int nBufSize)
{
if (!LoadString(hInst, uID, lpBuffer, nBufSize))
wcscpy(lpBuffer, TEXT(""));
//UN_stopScanning();
return lpBuffer;
}
#endifLRESULT CALLBACK CNMS_WHScan_OutCar::BasicScanProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
DWORD dwResult;
TCHAR szMsgBuf[256];
LPSCAN_BUFFER lpScanBuf;
HWND hctl_data; switch(uMsg)
{
case WM_INITDIALOG: ::PostMessage(hwnd,UM_STARTSCANNING,0,0L);
break; case UM_STARTSCANNING:
dwResult = SCAN_Open(szScannerName, &hScanner);
if ( dwResult != E_SCN_SUCCESS )
{
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_Open"));
break;
} dwResult = SCAN_Enable(hScanner);
if ( dwResult != E_SCN_SUCCESS )
{
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_Enable"));
break;
} lpScanBuffer = SCAN_AllocateBuffer(bUseText, dwScanSize);
if (lpScanBuffer == NULL)
{
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_AllocateBuffer"));
return TRUE;
} dwResult = SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hwnd,
UM_SCAN,
500,
NULL);
if ( dwResult != E_SCN_SUCCESS )
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
break;
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(hwnd, 0);
}
bStopScanning = TRUE; return TRUE; case WM_ACTIVATE:
switch(LOWORD(wParam))
{
case WA_INACTIVE:
hctl_data = ::GetDlgItem(hwnd,IDC_EDIT_DATA);
::Edit_SetText(hctl_data, UM_loadMsg(IDS_INACTIVE,szMsgBuf, countof(szMsgBuf)));
if (bRequestPending)
dwResult = SCAN_Flush(hScanner);
break;
default: // activating
hctl_data = ::GetDlgItem(hwnd,IDC_EDIT_DATA);
::Edit_SetText(hctl_data, UM_loadMsg(IDS_READY,szMsgBuf, countof(szMsgBuf))); if (!bRequestPending && lpScanBuffer != NULL && !bStopScanning)
{
dwResult = SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hwnd,
UM_SCAN,
dwScanTimeout,
NULL);
if ( dwResult != E_SCN_SUCCESS )
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
}
break;
}
break; case UM_SCAN: bRequestPending = FALSE; // Clear the soft trigger
bTriggerFlag = FALSE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag); // Get scan result from the scan buffer, and display it
lpScanBuf = (LPSCAN_BUFFER)lParam;
if ( lpScanBuf == NULL )
UM_errorExit(UM_hwnd, IDS_ERR_BUF, 0); hctl_data = ::GetDlgItem(hwnd,IDC_EDIT_DATA); switch (SCNBUF_GETSTAT(lpScanBuf))
{
case E_SCN_DEVICEFAILURE:
::Edit_SetText(hctl_data, UM_loadMsg(IDS_DEVICE_FAILURE,szMsgBuf, countof(szMsgBuf)));
break; case E_SCN_READPENDING:
::Edit_SetText(hctl_data, UM_loadMsg(IDS_READ_PENDING,szMsgBuf, countof(szMsgBuf)));
break; case E_SCN_READCANCELLED: if (bStopScanning)
{ // complete the second step of UM_STOPSCANNING
::SendMessage(hwnd, UM_STOPSCANNING, 0, 0L);
return TRUE;
}
if (!GetFocus())
break; // Do nothing if read was cancelled while deactivation ::Edit_SetText(hctl_data, UM_loadMsg(IDS_READ_PENDING,szMsgBuf, countof(szMsgBuf)));
break; case E_SCN_READTIMEOUT:
if(bContinuousMode)
::PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break;
case E_SCN_SUCCESS:
::Edit_SetText(hctl_data, (LPTSTR)SCNBUF_GETDATA(lpScanBuffer)); CString BTempStr=_T("");
m_WHSOutCar_Barcode.GetWindowTextW(BTempStr);
if(sizeof(lpScanBuffer)>0&&BTempStr.Compare(_T("■■■■■■■■"))!=0)
{
m_WHSOutCar_Barcode.SetWindowTextW((LPTSTR)SCNBUF_GETDATA(lpScanBuffer));
OnBnClickedWhsoutcarSave();//保存入库信息
} if(bContinuousMode)
::PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break;
} if (GetFocus())
{
dwResult = SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hwnd,
uMsg,
dwScanTimeout,
NULL);
if ( dwResult != E_SCN_SUCCESS )
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
} return TRUE; case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BUTTON_SOFTTRIGGER:
// Clear the state first before we set it to TRUE
bTriggerFlag = FALSE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag); bTriggerFlag = TRUE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag); break;
case IDC_CONTINUOUS: //Check for Continuous Scan Mode
bContinuousMode = !bContinuousMode;
if(bContinuousMode)
::PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break; case IDOK: // fall through case IDCANCEL:
::SendMessage(hwnd,UM_STOPSCANNING,0,0L);
break;
}
return TRUE;
}
//return FALSE;
return TRUE;
}
解决方案 »
- error C2143: 语法错误 : 缺少“;”(在“CElectric::get”的前面)
- 紧急求助,ADO连接ORACLE的问题
- 求助VC问题Debug Assertion Failed!
- vc mfc list 不同对话框 传值
- EVC下如何读取配置文件?
- 写Log出现如下错误exception in ***.exe: 0xC0000005:Access Violation,急啊 高手请进
- 高手指点我啊~~
- 插值原理
- 菜鸟问题,请问在用ATL时如果增加的方法在IDL里修改之后?
- 请帮忙介绍一下提供“视频播放:vc原代码”的好网站!
- 好久没有散分,今天高兴散一个
- VC中...不使用stdAfx.h有什么后果?
试着用多线程来解决。
有一打开扫描头的时间不定,打开程序可扫描的时间有长有短。还有很容易程序就死机了,重启,比如打开程序都一会儿,不作什么操作,它都会自动死机;
程序大致如下:BOOL CNMS_WHScan_OutCar::OnInitDialog()
{
CDialog::OnInitDialog();
#if defined(HAVE_SCANNER)
// 初始化 Scanner
UM_init();
#endifreturn TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
#if defined(HAVE_SCANNER)
void CNMS_WHScan_OutCar::UM_init()
{
...............
::PostMessage(m_hWnd, UM_STARTSCANNING, 0, 0L);
}void CNMS_WHScan_OutCar::UM_errorExit(HWND hwnd, UINT uID, LPTSTR szFunc)
{
........
::PostMessage(m_hWnd,UM_STOPSCANNING,0,0L);
}BOOL CNMS_WHScan_OutCar::PreTranslateMessage(MSG *pMsg)
{
BasicScanProc(pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam);
return CDialog::PreTranslateMessage(pMsg);
}LPTSTR CNMS_WHScan_OutCar::UM_loadMsg(UINT uID, LPTSTR lpBuffer, int nBufSize)
{
if (!LoadString(hInst, uID, lpBuffer, nBufSize))
wcscpy(lpBuffer, TEXT(""));
return lpBuffer;
}
#endifLRESULT CALLBACK CNMS_WHScan_OutCar::BasicScanProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
.....
switch(uMsg)
{
case WM_INITDIALOG:
::PostMessage(hwnd,UM_STARTSCANNING,0,0L);
break;
case UM_STARTSCANNING:
dwResult = SCAN_Open(szScannerName, &hScanner);
......
break;
return TRUE;
case UM_STOPSCANNING:
......
bStopScanning = TRUE;
return TRUE;
case WM_ACTIVATE:
switch(LOWORD(wParam))
{
case WA_INACTIVE:
break;
default:
...
break;
case UM_SCAN:
switch (SCNBUF_GETSTAT(lpScanBuf))
{
case E_SCN_SUCCESS:
::Edit_SetText(hctl_data, (LPTSTR)SCNBUF_GETDATA(lpScanBuffer));
if(bContinuousMode)
::PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break;
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BUTTON_SOFTTRIGGER:
.......
break;
case IDCANCEL:
::SendMessage(hwnd,UM_STOPSCANNING,0,0L);
break;
}
return TRUE;
}
return FALSE;
}
http://community.csdn.net/Expert/TopicView1.asp?id=5139224