⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbulkctl.cpp

📁 USB通讯控件,Bulk通讯方式,可以直接从USB设备中读取数据保存为文件,或者把文件发送给USB设备,用于三星2410相关开发.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// UsbulkCtl.cpp : Implementation of the CUsbulkCtrl ActiveX Control class.

#include "stdafx.h"
#include "Usbulk.h"
#include "UsbulkCtl.h"
#include "UsbulkPpg.h"

#include <process.h>
#include "d_box.h"
#include "rwbulk.h"
#include "Resource.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


#define USB_OVERLAPPED_IO FALSE  //should be FALSE becasue USB overlapped IO doesn't work well.
#define TX_SIZE (4096*4) 


IMPLEMENT_DYNCREATE(CUsbulkCtrl, COleControl)



/////////////////////////////////////////////////////////////////////////////
// Message map


BEGIN_MESSAGE_MAP(CUsbulkCtrl, COleControl)
	//{{AFX_MSG_MAP(CUsbulkCtrl)
	// NOTE - ClassWizard will add and remove message map entries
	//    DO NOT EDIT what you see in these blocks of generated code !
	//}}AFX_MSG_MAP
	ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// Dispatch map

BEGIN_DISPATCH_MAP(CUsbulkCtrl, COleControl)
	//{{AFX_DISPATCH_MAP(CUsbulkCtrl)
	DISP_FUNCTION(CUsbulkCtrl, "WriteUsbFile", WriteUsbFile, VT_BSTR, VTS_BSTR VTS_BSTR VTS_BSTR)
	DISP_FUNCTION(CUsbulkCtrl, "ReadUsbFile", ReadUsbFile, VT_BSTR, VTS_BSTR VTS_BSTR VTS_BSTR)
	DISP_FUNCTION(CUsbulkCtrl, "GetFileLength", GetFileLength, VT_I4, VTS_BSTR VTS_BSTR)
	DISP_FUNCTION(CUsbulkCtrl, "CreateDir", CreateDir, VT_BOOL, VTS_BSTR)
	DISP_FUNCTION(CUsbulkCtrl, "SearchFiles", SearchFiles, VT_BSTR, VTS_BSTR)
	DISP_FUNCTION(CUsbulkCtrl, "GetFileName", GetFileName, VT_BSTR, VTS_BSTR VTS_BSTR)
	DISP_FUNCTION(CUsbulkCtrl, "GetFolderName", GetFolderName, VT_BSTR, VTS_BSTR)
	DISP_FUNCTION(CUsbulkCtrl, "DeleteDir", DeleteDir, VT_BOOL, VTS_BSTR)
	DISP_FUNCTION(CUsbulkCtrl, "ResetDevice", ResetDevice, VT_EMPTY, VTS_NONE)
	//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()


/////////////////////////////////////////////////////////////////////////////
// Event map

BEGIN_EVENT_MAP(CUsbulkCtrl, COleControl)
	//{{AFX_EVENT_MAP(CUsbulkCtrl)
	//}}AFX_EVENT_MAP
END_EVENT_MAP()


/////////////////////////////////////////////////////////////////////////////
// Property pages

// TODO: Add more property pages as needed.  Remember to increase the count!
BEGIN_PROPPAGEIDS(CUsbulkCtrl, 1)
	PROPPAGEID(CUsbulkPropPage::guid)
END_PROPPAGEIDS(CUsbulkCtrl)


/////////////////////////////////////////////////////////////////////////////
// Initialize class factory and guid

IMPLEMENT_OLECREATE_EX(CUsbulkCtrl, "USBULK.UsbulkCtrl.1",
	0xb25eb85d, 0xedec, 0x4c02, 0xaa, 0x2, 0x35, 0xc0, 0xf2, 0x7e, 0xdf, 0xcd)


/////////////////////////////////////////////////////////////////////////////
// Type library ID and version

IMPLEMENT_OLETYPELIB(CUsbulkCtrl, _tlid, _wVerMajor, _wVerMinor)


/////////////////////////////////////////////////////////////////////////////
// Interface IDs

const IID BASED_CODE IID_DUsbulk =
		{ 0x8e1a8d56, 0x92b4, 0x44f1, { 0x9c, 0xe6, 0xbb, 0x28, 0x54, 0x6c, 0xf0, 0x6c } };
const IID BASED_CODE IID_DUsbulkEvents =
		{ 0x7a87b535, 0x2ffc, 0x492a, { 0xba, 0x47, 0xe7, 0xe4, 0xb2, 0x35, 0x48, 0x40 } };


/////////////////////////////////////////////////////////////////////////////
// Control type information

static const DWORD BASED_CODE _dwUsbulkOleMisc =
	OLEMISC_ACTIVATEWHENVISIBLE |
	OLEMISC_SETCLIENTSITEFIRST |
	OLEMISC_INSIDEOUT |
	OLEMISC_CANTLINKINSIDE |
	OLEMISC_RECOMPOSEONRESIZE;

IMPLEMENT_OLECTLTYPE(CUsbulkCtrl, IDS_USBULK, _dwUsbulkOleMisc)


/////////////////////////////////////////////////////////////////////////////
// CUsbulkCtrl::CUsbulkCtrlFactory::UpdateRegistry -
// Adds or removes system registry entries for CUsbulkCtrl

BOOL CUsbulkCtrl::CUsbulkCtrlFactory::UpdateRegistry(BOOL bRegister)
{
	// TODO: Verify that your control follows apartment-model threading rules.
	// Refer to MFC TechNote 64 for more information.
	// If your control does not conform to the apartment-model rules, then
	// you must modify the code below, changing the 6th parameter from
	// afxRegApartmentThreading to 0.

	if (bRegister)
		return AfxOleRegisterControlClass(
			AfxGetInstanceHandle(),
			m_clsid,
			m_lpszProgID,
			IDS_USBULK,
			IDB_USBULK,
			afxRegApartmentThreading,
			_dwUsbulkOleMisc,
			_tlid,
			_wVerMajor,
			_wVerMinor);
	else
		return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}


/////////////////////////////////////////////////////////////////////////////
// CUsbulkCtrl::CUsbulkCtrl - Constructor

CUsbulkCtrl::CUsbulkCtrl()
{
	InitializeIIDs(&IID_DUsbulk, &IID_DUsbulkEvents);

	// TODO: Initialize your control's instance data here.
}


/////////////////////////////////////////////////////////////////////////////
// CUsbulkCtrl::~CUsbulkCtrl - Destructor

CUsbulkCtrl::~CUsbulkCtrl()
{
	// TODO: Cleanup your control's instance data here.
}


/////////////////////////////////////////////////////////////////////////////
// CUsbulkCtrl::OnDraw - Drawing function

void CUsbulkCtrl::OnDraw(
			CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
	// TODO: Replace the following code with your own drawing code.
	pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
	pdc->Ellipse(rcBounds);
}


/////////////////////////////////////////////////////////////////////////////
// CUsbulkCtrl::DoPropExchange - Persistence support

void CUsbulkCtrl::DoPropExchange(CPropExchange* pPX)
{
	ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
	COleControl::DoPropExchange(pPX);

	// TODO: Call PX_ functions for each persistent custom property.

}


/////////////////////////////////////////////////////////////////////////////
// CUsbulkCtrl::OnResetState - Reset control to default state

void CUsbulkCtrl::OnResetState()
{
	COleControl::OnResetState();  // Resets defaults found in DoPropExchange

	// TODO: Reset any other control state here.
}


/////////////////////////////////////////////////////////////////////////////
// CUsbulkCtrl message handlers

void UsbTxFile(void *args)
{
    void *txBlk;
    ULONG txBlkSize;
    DWORD nBytesWrite;
    DWORD txBufSize100;
	
#if USB_OVERLAPPED_IO
    //NOTE: hWrite should have FILE_FLAG_OVERLAPPED attribute.
    OVERLAPPED os;
    memset(&os,0,sizeof(OVERLAPPED));
	
    os.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
    if(os.hEvent==NULL)
    {
        free((void *)txBuf);
        CloseHandle(hWrite);    
		_endthread();
    }
#endif
	
    InitDownloadProgress();
	
    txBufSize100=txBufSize/100;
    if(txBufSize100==0) txBufSize100=1;	

	//CString t;
	//计时开始
	//t = "Begin at:" + (CTime::GetCurrentTime()).Format("%H:%M:%S");
	
    while(1)
    {
        if((txBufSize-iTxBuf) > TX_SIZE)
			txBlkSize=TX_SIZE;
		else
			txBlkSize=txBufSize-iTxBuf;
		
		txBlk=(void *)(txBuf+iTxBuf);
#if USB_OVERLAPPED_IO
		WriteFile(hWrite,txBlk,txBlkSize,&nBytesWrite,&os);
        //...
		GetOverlappedResult(hWrite,&os,&temp,FALSE); 	
		//...   
		//Why doesn't work GetOverlappedResult().
		//It may seem that secbulk.sys doesn't support OverlappedIO.
#else
		WriteFile(hWrite,txBlk,txBlkSize,&nBytesWrite,NULL);
#endif
		
		//assert(nBytesWrite == WriteLen);
		
		iTxBuf+=TX_SIZE;
		
		if( ((iTxBuf/txBufSize100)%2)==1 )
			DisplayDownloadProgress(iTxBuf/txBufSize100);

		if(downloadCanceled==1)break;	//download is canceled by user.
		
		if(iTxBuf>=txBufSize)break;
    }
	
    CloseDownloadProgress();
	
    free((void *)txBuf);
	
    CloseHandle(hWrite);    

	//计时结束
	//t = t + ", End at:" + (CTime::GetCurrentTime()).Format("%H:%M:%S");
	//AfxMessageBox(t,MB_OK | MB_ICONINFORMATION );

#if USB_OVERLAPPED_IO    
    CloseHandle(os);    
#endif
	//FireUSBTxEnd();
    _endthread();

}

void UsbTxFile64(void *args)
{
    void *txBlk;
    ULONG txBlkSize;
    DWORD nBytesWrite;
    DWORD txBufSize100;

	unsigned int txLen=60;
	
	iTxBuf = 8;

	txBufSize -= 2;	//去掉最后的两字节CRC校验;

	txBlk = (char *)malloc(64);

	*((WORD *)txBlk+0) = 0x111b;

    InitDownloadProgress();
    txBufSize100=txBufSize/100;
    if(txBufSize100==0) txBufSize100=1;	

	CString t;
	//计时开始
	//t = "Begin at:" + (CTime::GetCurrentTime()).Format("%H:%M:%S");

    while(1)
    {
        if((txBufSize-iTxBuf) > txLen)
		{
			txBlkSize=txLen;
			*((char *)txBlk+2) = 0x01;
		}
		else
		{
			txBlkSize=txBufSize-iTxBuf;
			*((char *)txBlk+2) = 0x00;
		}

		txBlkSize +=4;
		*((char *)txBlk+3) = (unsigned int)txBlkSize;
		
		memcpy((char *)txBlk+4, (char *)txBuf+iTxBuf,txLen);

		WriteFile(hWrite,txBlk,txBlkSize,&nBytesWrite,NULL);

		iTxBuf =iTxBuf + (txBlkSize - 4);
		
		if( ((iTxBuf/txBufSize100)%2)==1 )
			DisplayDownloadProgress(iTxBuf/txBufSize100);
		
		if(downloadCanceled==1)break;	//download is canceled by user.
		
		if(iTxBuf>=txBufSize)break;
    }
	
    CloseDownloadProgress();
	
    free((void *)txBuf);
	free(txBlk);
	
    CloseHandle(hWrite); 
	
	//计时结束
	//t = t + ", End at:" + (CTime::GetCurrentTime()).Format("%H:%M:%S");
	//AfxMessageBox(t,MB_OK | MB_ICONINFORMATION );
	
#if USB_OVERLAPPED_IO    
    CloseHandle(os);    
#endif
	
    _endthread();
}

DWORD RecordLog(LPCTSTR eventsName,LPCTSTR paraStr,LPCTSTR resultStr)
{
	CFile nTargetFile;
	CString tFileName;
	CString strLog;
	CTime t1=CTime::GetCurrentTime();
	//tFileName.Format("C:\\Windows\\%04d-%02d-%02d.log",t1.GetYear(),t1.GetMonth(),t1.GetDay());
	tFileName = "C:\\windows\\udisk.log";

	if(nTargetFile.Open(_T(tFileName), CFile::modeNoTruncate | CFile::modeCreate | CFile::modeReadWrite)==0)
	{
		return 1;
	}
	strLog.Format("%04d-%02d-%02d ",t1.GetYear(),t1.GetMonth(),t1.GetDay()); 
	strLog = strLog + t1.Format("%H:%M:%S") + "\t" + eventsName+ "\t" + paraStr + "\t" + resultStr + "\r\n";
	nTargetFile.SeekToEnd();
	nTargetFile.Write(strLog,strLog.GetLength());
	nTargetFile.Close();
	return 0;
}

DWORD SendToUSB(void *args)
{
    void *txBlk;
    ULONG txBlkSize;
    DWORD respLen;
	
	iTxBuf = 0;

    hWrite = open_file(outPipe);
    
    if(hWrite==INVALID_HANDLE_VALUE)
    {
		free((void *)txBuf);
		return -1;
    }

    while(1)
    {
        if((txBufSize-iTxBuf) > TX_SIZE)
			txBlkSize=TX_SIZE;
		else
			txBlkSize=txBufSize-iTxBuf;
		
		txBlk=(void *)(txBuf+iTxBuf);

		WriteFile(hWrite,txBlk,txBlkSize,&respLen,NULL);
		
		iTxBuf+=TX_SIZE;
		
		if(iTxBuf>=txBufSize) break;
    }
		
    free((void *)txBuf);
	
    CloseHandle(hWrite);
    
	iTxBuf=0;

	return respLen;
}

DWORD SendToUSB64(void *args)
{
    void *txBlk;
    ULONG txBlkSize;
    DWORD respLen;

	unsigned int txLen=56;
	
	iTxBuf = 8;

    hWrite = open_file(outPipe);
    
    if(hWrite==INVALID_HANDLE_VALUE)
    {
		free((void *)txBuf);
		return -1;
    }

	txBlk = (char *)malloc(64);

    memcpy((char *)txBlk, (char *)txBuf,8);

	while(1)
    {
        if((txBufSize-iTxBuf) > txLen)
		{
			txBlkSize=txLen;
			*((char *)txBlk+3) = 0x01;
		}
		else
		{
			txBlkSize=txBufSize-iTxBuf;
			*((char *)txBlk+3) = 0x00;
		}

		txBlkSize +=8;
		*((DWORD *)txBlk+1) = txBlkSize;
		//txBlk=(void *)(txBuf+iTxBuf);

		memcpy((char *)txBlk+8, (char *)txBuf+iTxBuf,txLen);

		WriteFile(hWrite,txBlk,txBlkSize,&respLen,NULL);
		
		iTxBuf =iTxBuf + (txBlkSize - 8);
		
		if(iTxBuf>=txBufSize) break;
    }

	//////////////////////////////////////////////
	UINT i;
	CString c;
	CString t;
	for(i=0;i<txBufSize;i++)
	{
		c.Format("%2x ",*((char *)txBuf+i));
		t =  t + c;
	}
	RecordLog("SendToUSB","code",t);	
	//////////////////////////////////////////////

    free((void *)txBuf);
	free(txBlk);
	
    CloseHandle(hWrite);
    
	respLen=iTxBuf;
	iTxBuf=0;

	return respLen;
}

//实现DoEvents的效果,但有一点不同,如果该函数返回FALSE,表示按下了关闭按钮。
BOOL CheckMessageQueue() 
{ 
	MSG msg; 
	
	while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ 
		if(msg.message==WM_QUIT) 
			return FALSE; 
		TranslateMessage(&msg); 
		DispatchMessage(&msg); 
	} 
	return TRUE; 
} 

//CRC16查表法
//联机命令1B 10 00 00 05的CS为 44 D0

#define CRC16		0x8005  //x16+x15+x2+1

const unsigned int crctab[]={
0x0000,0x8005,0x800f,0x000a,0x801b,0x001e,0x0014,0x8011,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -