www.pudn.com > NetPaw.rar > NetPaw.cpp


// NetPaw.cpp : 定义应用程序的类行为。 
// 
 
#include "stdafx.h" 
#include "NetPaw.h" 
#include "MainFrm.h" 
 
#include "NetPawDoc.h" 
#include "LeftView.h" 
#include ".\netpaw.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 
 
// should keep the same as in netpawhelper.cpp 
#define MAPPING_NAME _T("NETPAW_{A226912B-F4CE-4bd8-A189-C91FC047B848}") 
#define BHOEVENT_NAME _T("BHOEVENT_{4A041AB8-F1CC-413C-8D79-8021EA8B5D2D}") 
 
 
// CNetPawApp 
BEGIN_MESSAGE_MAP(CNetPawApp, CWinApp) 
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout) 
	// 基于文件的标准文档命令 
	ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) 
	ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) 
END_MESSAGE_MAP() 
 
 
// CNetPawApp 构造 
CNetPawApp::CNetPawApp() 
	: m_Registry("Scaton Software\\NetPaw") 
	, m_sSavePath(_T("")) 
	, m_nConnections(0) 
	, m_hBhoEvent(NULL) 
	, m_hShutEvent(NULL) 
	, m_pBhoEvtThread(NULL) 
{ 
	// TODO: 在此处添加构造代码, 
	// 将所有重要的初始化放置在 InitInstance 中 
} 
 
 
// 唯一的一个 CNetPawApp 对象 
 
CNetPawApp theApp; 
 
// CNetPawApp 初始化 
 
BOOL CNetPawApp::InitInstance() 
{ 
	// 如果一个运行在 Windows XP 上的应用程序清单指定要 
	// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, 
	//则需要 InitCommonControls()。否则,将无法创建窗口。 
	InitCommonControls(); 
 
	CWinApp::InitInstance(); 
 
	// 初始化 OLE 库 
	if (!AfxOleInit()) 
	{ 
		AfxMessageBox(IDP_OLE_INIT_FAILED); 
		return FALSE; 
	} 
 
	// initialize socket 
	WSADATA wsaData; 
	if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0 ) 
	{ 
		AfxMessageBox(IDP_SOCKETS_INIT_FAILED); 
		return FALSE; 
	} 
 
	AfxEnableControlContainer(); 
 
	// 标准初始化 
	// 如果未使用这些功能并希望减小 
	// 最终可执行文件的大小,则应移除下列 
	// 不需要的特定初始化例程 
	// 更改用于存储设置的注册表项 
	// TODO: 应适当修改该字符串, 
	// 例如修改为公司或组织名 
	SetRegistryKey(_T("Scaton Software")); 
	LoadStdProfileSettings(4);  // 加载标准 INI 文件选项(包括 MRU) 
 
	// load downloading setting 
	LoadSettings(); 
 
	// 注册应用程序的文档模板。文档模板 
	// 将用作文档、框架窗口和视图之间的连接 
	CSingleDocTemplate* pDocTemplate; 
	pDocTemplate = new CSingleDocTemplate( 
		IDR_MAINFRAME, 
		RUNTIME_CLASS(CNetPawDoc), 
		RUNTIME_CLASS(CMainFrame),       // 主 SDI 框架窗口 
		RUNTIME_CLASS(CLeftView)); 
	if (!pDocTemplate) 
		return FALSE; 
	AddDocTemplate(pDocTemplate); 
 
	// 分析标准外壳命令、DDE、打开文件操作的命令行 
	CCommandLineInfo cmdInfo; 
	ParseCommandLine(cmdInfo); 
 
	// 调度在命令行中指定的命令。如果 
	// 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。 
	if (!ProcessShellCommand(cmdInfo)) 
		return FALSE; 
 
	// 唯一的一个窗口已初始化,因此显示它并对其进行更新 
	m_pMainWnd->ShowWindow(SW_SHOW); 
	m_pMainWnd->UpdateWindow(); 
 
	// call download now 
	DownloadIEUrl(); 
 
	// create thread to wait for another triggers 
	m_hBhoEvent = CreateEvent(NULL, FALSE, FALSE, BHOEVENT_NAME); 
	m_hShutEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 
 
	m_pBhoEvtThread = AfxBeginThread(ThreadProc, (LPVOID)this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); 
	m_pBhoEvtThread->m_bAutoDelete = FALSE; 
	m_pBhoEvtThread->ResumeThread(); 
 
	// 仅当存在后缀时才调用 DragAcceptFiles, 
	//  在 SDI 应用程序中,这应在 ProcessShellCommand  之后发生 
	return TRUE; 
} 
 
int CNetPawApp::ExitInstance() 
{ 
	// TODO: 在此添加专用代码和/或调用基类 
	WSACleanup(); 
 
	// delete thread 
	if( m_pBhoEvtThread ) 
	{ 
		SetEvent(m_hShutEvent); 
		WaitForSingleObject(m_pBhoEvtThread->m_hThread, INFINITE); 
		delete m_pBhoEvtThread; 
	} 
 
	if( m_hBhoEvent ) 
		CloseHandle(m_hBhoEvent); 
 
	if( m_hShutEvent ) 
		CloseHandle(m_hShutEvent); 
 
	return CWinApp::ExitInstance(); 
} 
 
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// 对话框数据 
	enum { IDD = IDD_ABOUTBOX }; 
 
protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持 
 
// 实现 
protected: 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
END_MESSAGE_MAP() 
 
// 用于运行对话框的应用程序命令 
void CNetPawApp::OnAppAbout() 
{ 
	CAboutDlg aboutDlg; 
	aboutDlg.DoModal(); 
} 
 
 
// CNetPawApp 消息处理程序 
void CNetPawApp::GetLastDrive(CString &sLastDrive) 
{ 
	UINT uType; 
	char szDrive[4];  
	szDrive[1] = ':'; 
	szDrive[2] = '\0'; 
	sLastDrive = _T("C:"); 
 
	// get drive bitmask: LSB = A; LSB+1 = B; and so on 
	DWORD dwDrives = GetLogicalDrives(); 
 
	// do all 26 drives(A-Z) just for kicks 
	for( int i = 0; i < 26; i++ ) 
	{ 
		szDrive[0] = 'A' + (char)i; 
		if( dwDrives & 1 ) 
		{ 
			ASSERT(strlen(szDrive)== 2); 
 
			char szTemp[8]; 
			strcpy(szTemp, szDrive); 
			strcat(szTemp, "\\."); 
			uType = GetDriveType( (LPCTSTR)szTemp ); 
 
			switch(uType) 
			{ 
			case DRIVE_FIXED: 
				// now save the current fixed drive name 
				sLastDrive = szDrive; 
				break; 
 
			default : 
				break; 
			} 
		} 
 
		dwDrives = dwDrives >> 1; 
	} 
} 
 
void CNetPawApp::LoadSettings(void) 
{ 
	// load settings 
	if( m_Registry.SectionExists( "Settings" ) ) 
	{ 
		m_Registry.Descend( "Settings" ); 
		m_Registry.Read( "SavePath", m_sSavePath ); 
		m_Registry.Read( "Connections", m_nConnections ); 
 
		m_Registry.Ascend(); 
	} 
 
	// default saving location 
	if( m_sSavePath.IsEmpty() ) 
	{ 
		CString sDrive; 
		GetLastDrive(sDrive); 
		m_sSavePath = sDrive + DEFAULT_PATH; 
	} 
 
	if( m_nConnections == 0 ) 
	{ 
		m_nConnections = DEFAULT_CONNS; 
	} 
} 
 
void CNetPawApp::SaveSettings(void) 
{ 
	// save default settings 
	m_Registry.Descend( "Settings" ); 
	m_Registry.Write( "SavePath", m_sSavePath ); 
	m_Registry.Write( "Connections", m_nConnections ); 
	m_Registry.Ascend(); 
} 
 
void CNetPawApp::DownloadIEUrl() 
{ 
	// check if IE sets our url 
	if( !m_obFileMapping.IsMappingExist(MAPPING_NAME) ) 
	{ 
		return; 
	} 
 
	// get the url from filemapping 
	URLDATA_S *pData = (URLDATA_S *)m_obFileMapping.Open(); 
	if( pData && (pData->szDownldUrl[0] != 0) ) 
	{ 
		// launch the downloader 
		((CMainFrame *)m_pMainWnd)->SendMessage(WM_USER_DOWNLDIEURL, (WPARAM)pData); 
	} 
	m_obFileMapping.Close(); 
} 
 
UINT CNetPawApp::ThreadProc(PVOID pParam) 
{ 
	CNetPawApp *pApp = (CNetPawApp *)pParam; 
 
	DWORD dwResult; 
	HANDLE handles[2] = {pApp->m_hShutEvent, pApp->m_hBhoEvent}; 
 
	while(TRUE) 
	{ 
		dwResult = WaitForMultipleObjects(sizeof(handles)/sizeof(HANDLE), handles, FALSE, INFINITE); 
		if( dwResult == WAIT_OBJECT_0 ) 
		{ 
			break; 
		} 
		else if( dwResult == WAIT_OBJECT_0 + 1 ) 
		{ 
			pApp->DownloadIEUrl(); 
		} 
		else 
		{ 
			AtlTrace("WaitForMultipleObjects return error.\n"); 
		} 
	} 
 
	return 0; 
}