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

📄 usbkeypnpactivexctl.cpp

📁 手机智能卡开发
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	//}}AFX_MSG_MAP
	ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
	ON_MESSAGE(WM_DEVICECHANGE , OnDeviceChange)
	ON_MESSAGE(WM_USER+1, OnFireOnUSBKeyChange)
	ON_MESSAGE(WM_USER+2, OnProgressMsg)
END_MESSAGE_MAP()


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

BEGIN_DISPATCH_MAP(CUSBKeyPnPActiveXCtrl, COleControl)
	//{{AFX_DISPATCH_MAP(CUSBKeyPnPActiveXCtrl)
	DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "EnumUsbKey", EnumUsbKey, VT_BSTR, VTS_NONE)
	DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "getUserInfoByContainer", getUserInfoByContainer, VT_BSTR, VTS_BSTR VTS_I2)
	DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "getUserList", getUserList, VT_BSTR, VTS_NONE)
	DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "RegisterDeviceInterface", RegisterDeviceInterface, VT_EMPTY, VTS_NONE)
	DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "SetLoginState", SetLoginState, VT_BOOL, VTS_BSTR VTS_BSTR)
	DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "GetSavedPass", GetSavedPass, VT_BSTR, VTS_BSTR)
	DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "GetUSBKeyList", GetUSBKeyList, VT_BSTR, VTS_NONE)
	DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "GetPassSaveState", GetPassSaveState, VT_BOOL, VTS_BSTR)
	DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "SaveUserPass", SaveUserPass, VT_BOOL, VTS_BSTR VTS_BSTR)
	DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "DelUserPass", DelUserPass, VT_BOOL, VTS_BSTR)
	//}}AFX_DISPATCH_MAP
	DISP_FUNCTION_ID(CUSBKeyPnPActiveXCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()


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

BEGIN_EVENT_MAP(CUSBKeyPnPActiveXCtrl, COleControl)
	//{{AFX_EVENT_MAP(CUSBKeyPnPActiveXCtrl)
	EVENT_CUSTOM("OnUSBKeyChange", FireOnUSBKeyChange, VTS_NONE)
	//}}AFX_EVENT_MAP
END_EVENT_MAP()


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

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


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

IMPLEMENT_OLECREATE_EX(CUSBKeyPnPActiveXCtrl, "USBKEYPNPACTIVEX.USBKeyPnPActiveXCtrl.1",
	0xcf5259b, 0xa812, 0x4b6e, 0x97, 0x46, 0xac, 0xf7, 0x27, 0x9f, 0xef, 0x74)


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

IMPLEMENT_OLETYPELIB(CUSBKeyPnPActiveXCtrl, _tlid, _wVerMajor, _wVerMinor)


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

const IID BASED_CODE IID_DUSBKeyPnPActiveX =
		{ 0x2d85d5ef, 0x6954, 0x464e, { 0x96, 0xf7, 0xc1, 0x19, 0xdc, 0xdd, 0xab, 0x81 } };
const IID BASED_CODE IID_DUSBKeyPnPActiveXEvents =
		{ 0xe7d2618, 0x9ebe, 0x4227, { 0x9f, 0x98, 0x9b, 0x86, 0x43, 0x90, 0x54, 0x8 } };


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

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

IMPLEMENT_OLECTLTYPE(CUSBKeyPnPActiveXCtrl, IDS_USBKEYPNPACTIVEX, _dwUSBKeyPnPActiveXOleMisc)


/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::CUSBKeyPnPActiveXCtrlFactory::UpdateRegistry -
// Adds or removes system registry entries for CUSBKeyPnPActiveXCtrl

BOOL CUSBKeyPnPActiveXCtrl::CUSBKeyPnPActiveXCtrlFactory::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_USBKEYPNPACTIVEX,
			IDB_USBKEYPNPACTIVEX,
			afxRegApartmentThreading,
			_dwUSBKeyPnPActiveXOleMisc,
			_tlid,
			_wVerMajor,
			_wVerMinor);
	else
		return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}


/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::CUSBKeyPnPActiveXCtrl - Constructor

CUSBKeyPnPActiveXCtrl::CUSBKeyPnPActiveXCtrl()
{
	InitializeIIDs(&IID_DUSBKeyPnPActiveX, &IID_DUSBKeyPnPActiveXEvents);

	// TODO: Initialize your control's instance data here.
	//AfxMessageBox("CUSBKeyPnPActiveXCtrl::CUSBKeyPnPActiveXCtrl");
	bIsReged = FALSE;
	hDevNotify = NULL;
 	InitializeCriticalSection(&g_cs);
	HINSTANCE hInst = AfxGetInstanceHandle();
	HANDLE hResource = ::LoadResource(hInst, FindResource(hInst,
		reinterpret_cast<LPCTSTR>(IDD_MYPROG_DLG), RT_DIALOG));
	pProgressDlg.SetTipInfor("有智能卡插入");
	LPDLGTEMPLATE lpTemplate = static_cast<DLGTEMPLATE*>(LockResource(hResource));
	pProgressDlg.CreateIndirect(lpTemplate);
	pProgressDlg.SetProgress(0);
	
}


/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::~CUSBKeyPnPActiveXCtrl - Destructor

CUSBKeyPnPActiveXCtrl::~CUSBKeyPnPActiveXCtrl()
{
	// TODO: Cleanup your control's instance data here.
	pProgressDlg.DestroyWindow();
//	DeleteCriticalSection(&g_cs);
	
	if(hDevNotify)
	{
		//AfxMessageBox("UnregisterDeviceNotification");
		UnregisterDeviceNotification(hDevNotify);
	}
	//BjcaUnRegDevNotify_MWIC(this->GetSafeHwnd());
	//BjcaUnRegDevNotify_HDIC(this->GetSafeHwnd());
	
}


/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::OnDraw - Drawing function

void CUSBKeyPnPActiveXCtrl::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);
}


/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::DoPropExchange - Persistence support

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

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

}


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

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

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


/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::AboutBox - Display an "About" box to the user

void CUSBKeyPnPActiveXCtrl::AboutBox()
{
	//test
	//DWORD lpdwHandle;
	//DWORD dwSize = GetFileVersionInfoSize("c:\\USBKeyPnPActiveX.ocx",&lpdwHandle);
	
	CDialog dlgAbout(IDD_ABOUTBOX_USBKEYPNPACTIVEX);
	dlgAbout.DoModal();
}


/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl message handlers

BSTR CUSBKeyPnPActiveXCtrl::EnumUsbKey() 
{
	CString strResult;

	///*
	char szTraceBuf[256];
 
	// Get device interface info set handle for all devices attached to system
	HDEVINFO hDevInfo = SetupDiGetClassDevs(
	&GUID_DEVINTERFACE_USB_DEVICE,  
	NULL,  
	NULL,  
	DIGCF_PRESENT | DIGCF_DEVICEINTERFACE  
	); 
	
	if (hDevInfo == INVALID_HANDLE_VALUE)
	{
		sprintf(szTraceBuf, "SetupDiClassDevs() failed. GetLastError() " \
		"returns: 0x%x\n", GetLastError());
		DEBUGMSG(szTraceBuf);
		return strResult.AllocSysString();
	}
	
	sprintf(szTraceBuf, "Device info set handle for all devices attached to " \
	"system: 0x%x\n", hDevInfo);
	OutputDebugString(szTraceBuf);
	DEBUGMSG(szTraceBuf);
	
	// Retrieve a context structure for a device interface of a device 
	// information set.
	for(int i=0;;i++)
	{
		if(g_bjcakeycallway_suport[i].dwVendorID == 0)
			break;
		g_bjcakeycallway_suport[i].isExist = 0;
				
	}	
	for(i=0;i<MAX_CERT_COUNT;i++)
	{
		g_AllCertInfo[i].isValide = FALSE;
	}
	DEBUGMSG("");
//	sCurusbNames.RemoveAll();
	DWORD dwIndex = 0;
	SP_DEVICE_INTERFACE_DATA devInterfaceData;
	ZeroMemory(&devInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA));
	devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
	BOOL bRet = FALSE;
	while(TRUE)
	{ 
		bRet = SetupDiEnumDeviceInterfaces(
		hDevInfo,  
		NULL,  
		&GUID_DEVINTERFACE_USB_DEVICE,  
		dwIndex,
		&devInterfaceData  
		);
		if (!bRet)
		{
			
			if (GetLastError() == ERROR_NO_MORE_ITEMS)
			{
				break;
			}
			sprintf(szTraceBuf, "SetupDiEnumDeviceInterfaces failed " \
				"GetLastError() returns: 0x%x\n", GetLastError());
			OutputDebugString(szTraceBuf);
			DEBUGMSG(szTraceBuf);
		}//end if bRet
		dwIndex++; 
		sprintf(szTraceBuf,"dwIndex=%d",dwIndex);
		DEBUGMSG(szTraceBuf);
		//查找设备路径
		//SP_DEVICE_INTERFACE_DETAIL_DATA strtDetailData;
		//ZeroMemory(&strtDetailData, sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA));
		//strtDetailData.cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
		PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
		pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)GlobalAlloc(LMEM_ZEROINIT, 1024);
		pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
		
		 if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInterfaceData,
			   pDetail,1024,NULL,NULL))
		 {
			 GlobalFree(pDetail);
			 sprintf(szTraceBuf, "SetupDiGetDeviceInterfaceDetail failed " \
				 "GetLastError() returns: 0x%x\n", GetLastError());
			 DEBUGMSG(szTraceBuf);
			   continue;
		 }
		
		 // 找到了设备路径
		 CString m_strPath = pDetail->DevicePath;
//		 sCurusbNames.Add(m_strPath);
		 GlobalFree(pDetail);
		 WORD vid,pid;
		 sprintf(szTraceBuf,"m_strPath=%s",m_strPath.GetBuffer(0));
		 DEBUGMSG(szTraceBuf);	
		 if(ParseDevicePath(m_strPath.GetBuffer(0),vid,pid))
		 {
			 //update bjcakey status
			 //g_bjcakeycallway_suport
			  for(int i=0;;i++)
			  {
				  if(g_bjcakeycallway_suport[i].dwVendorID == 0)
					  break;
				  if( (g_bjcakeycallway_suport[i].dwVendorID == vid) &&(g_bjcakeycallway_suport[i].dwProductID==pid))
				  {
					  g_bjcakeycallway_suport[i].isExist ++;
					  break;
				  }				  				  
			  }			 
		 }
		
	}//end while
	
	SetupDiDestroyDeviceInfoList(hDevInfo);
	DEBUGMSG("SetupDiDestroyDeviceInfoList");
	//*/
	
	 if(IsWin98())
		EnumUsbDevice();
	GetAllUSBKEYCertInfo();//读取当前USBKEY信息
	
	return strResult.AllocSysString();
}
//通过更底层的方法
void CUSBKeyPnPActiveXCtrl::EnumUsbDevice()
{
	char        HCName[16];
    int         HCNum;
    HANDLE      hHCDev;
	PCHAR       leafName;

	for(int i=0;;i++)
	{
		if(g_bjcakeycallway_suport[i].dwVendorID == 0)
			break;
		g_bjcakeycallway_suport[i].isExist = 0;
		
	}	
	for(i=0;i<MAX_CERT_COUNT;i++)
	{
		g_AllCertInfo[i].isValide = FALSE;
	}
	for (HCNum = 0; HCNum < NUM_HCS_TO_CHECK; HCNum++)
    {
		wsprintf(HCName, "\\\\.\\HCD%d", HCNum);
        hHCDev = CreateFile(HCName,
			GENERIC_WRITE,
			FILE_SHARE_WRITE,
			NULL,
			OPEN_EXISTING,
			0,
			NULL);
		if (hHCDev == INVALID_HANDLE_VALUE)
		{
			break;
		}
		leafName = HCName + sizeof("\\\\.\\") - sizeof("");
		PCHAR rootHubName;
		rootHubName =(char*) GetRootHubName(hHCDev);
		if(rootHubName == NULL)
		{
			CloseHandle(hHCDev);
			break;
		}
		CloseHandle(hHCDev);
		EnumerateHub(rootHubName);
		free(rootHubName);
	}//end for
}

/*
void CUSBKeyPnPActiveXCtrl::EnumUsbDevice()
{
	char        HCName[16];
    int         HCNum;
    HANDLE      hHCDev;
    PCHAR       rootHubName;
    PCHAR       leafName;
	CString strShow;
	ULONG       index;
    BOOL        success;
	
    PUSB_NODE_CONNECTION_INFORMATION    connectionInfo;
	HANDLE hHubDevice;
	
	for(int i=0;;i++)
	{
		if(g_bjcakeycallway_suport[i].dwVendorID == 0)
			break;
		g_bjcakeycallway_suport[i].isExist = 0;
		
	}	
	for(i=0;i<MAX_CERT_COUNT;i++)
	{
		g_AllCertInfo[i].isValide = FALSE;
	}
	
	for (HCNum = 0; HCNum < NUM_HCS_TO_CHECK; HCNum++)
    {
        wsprintf(HCName, "\\\\.\\HCD%d", HCNum);
        hHCDev = CreateFile(HCName,
                            GENERIC_WRITE,
                            FILE_SHARE_WRITE,
                            NULL,
                            OPEN_EXISTING,
                            0,
                            NULL);
		if (hHCDev != INVALID_HANDLE_VALUE)
        {
			strShow.Format("\r\n找到USB控制器:%d\r\n",HCNum+1);
			 
		}
		else
		{
			CloseHandle(hHCDev);
			break;
		}
	    leafName = HCName + sizeof("\\\\.\\") - sizeof("");
		strShow.Format("USB控制器名称:%s\r\n",leafName);
	 	ULONG           nBytes;
		
        rootHubName =(char*) GetRootHubName(hHCDev);
		if(rootHubName==NULL)
		{
			 strShow.Format("错误!\r\n");
			 CloseHandle(hHCDev);
			 break;
		}
		strShow.Format("USB Hub名称:\r\n%s\r\n",rootHubName);
		
		 PUSB_NODE_INFORMATION HubInfo;
		 HubInfo = (PUSB_NODE_INFORMATION)malloc(sizeof(USB_NODE_INFORMATION));
		 PCHAR deviceName;
		 deviceName = (PCHAR)malloc(strlen(rootHubName) + sizeof("\\\\.\\"));
         if (rootHubName != NULL)
         {
			strcpy(deviceName, "\\\\.\\");
			strcpy(deviceName + sizeof("\\\\.\\") - 1, rootHubName);
			hHubDevice = CreateFile(deviceName,
                            GENERIC_WRITE,
                            FILE_SHARE_WRITE,
                            NULL,
                            OPEN_EXISTING,
                            0,
                            NULL);
			free(deviceName);
			if (hHubDevice == INVALID_HANDLE_VALUE)
			{
				 strShow.Format("错误!\r\n");
				 free(HubInfo);	
				 CloseHandle(hHCDev);

⌨️ 快捷键说明

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