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

📄 remoteadminview.cpp

📁 VisualC++网络设计配套光盘代码第二章
💻 CPP
字号:
// RemoteAdminView.cpp : implementation of the CRemoteAdminView class
//

#include "stdafx.h"
#include "RemoteAdmin.h"
#include "MachineView.h"
#include "GlobalHelperFunc.h"
#include "GlobalMFCHelperFunc.h"
#include "RemoteAdminDoc.h"
#include "RemoteAdminView.h"

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

extern CRITICAL_SECTION g_CriticalSection;

/////////////////////////////////////////////////////////////////////////////
// CRemoteAdminView

IMPLEMENT_DYNCREATE(CRemoteAdminView, CListView)

BEGIN_MESSAGE_MAP(CRemoteAdminView, CListView)
	//{{AFX_MSG_MAP(CRemoteAdminView)
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_PROCESSOPTIONS_ENDPROCESS, OnEndProcess)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRemoteAdminView construction/destruction

CRemoteAdminView::CRemoteAdminView()
{
	// TODO: add construction code here

}

CRemoteAdminView::~CRemoteAdminView()
{
}

BOOL CRemoteAdminView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CListView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CRemoteAdminView drawing

void CRemoteAdminView::OnDraw(CDC* pDC)
{
	CRemoteAdminDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CListCtrl& refCtrl = GetListCtrl();
	refCtrl.InsertItem(0, "Item!");
	// TODO: add draw code for native data here
}

void CRemoteAdminView::OnInitialUpdate()
{
	CListView::OnInitialUpdate();

    CHeaderCtrl* pHeaderCtrl = GetListCtrl().GetHeaderCtrl();

    // Avoids repeation of headers when a new file is opened.
    if (pHeaderCtrl == NULL)
    {
        // Show the detail view
        GetListCtrl().ModifyStyle(LVS_TYPEMASK, LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS );
        GetListCtrl().SetExtendedStyle(GetListCtrl().GetExtendedStyle() | LVS_EX_FULLROWSELECT);
    
        // Insert the relevant columns
        GetListCtrl().InsertColumn(0, "Executable File",            LVCFMT_LEFT, 175);
        GetListCtrl().InsertColumn(1, "Process ID",                 LVCFMT_LEFT, 100);
        GetListCtrl().InsertColumn(2, "No. of Threads",             LVCFMT_LEFT, 100);
        GetListCtrl().InsertColumn(3, "Physical Memory Usage (KB)", LVCFMT_LEFT,150);
        //GetListCtrl().InsertColumn(3, "Parent Process ID", LVCFMT_LEFT, 100);
    }
}

/////////////////////////////////////////////////////////////////////////////
// CRemoteAdminView diagnostics

#ifdef _DEBUG
void CRemoteAdminView::AssertValid() const
{
	CListView::AssertValid();
}

void CRemoteAdminView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}

CRemoteAdminDoc* CRemoteAdminView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRemoteAdminDoc)));
	return (CRemoteAdminDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CRemoteAdminView message handlers
void CRemoteAdminView::OnStyleChanged(int nStyleType, LPSTYLESTRUCT lpStyleStruct)
{
	//TODO: add code to react to the user changing the view style of your window
}

void CRemoteAdminView::RefreshProcesses(CString strRemoteMachineIP)
{
    CProcessInfoList* pProcessInfoList = NULL;
    //PROCESSENTRY32* pPe                = NULL;
    SProcessInfo* pPe                  = NULL;
    POSITION pos                       = NULL;
    TCHAR szProcessID[10]              = _T("");
    TCHAR szThreadCount[10]            = _T(""); 
    TCHAR szMemoryUsage[30]            = _T("");

    pProcessInfoList  = GetDocument()->GetProcessInfoList(strRemoteMachineIP);
    int iProcessCount = pProcessInfoList->GetCount();
    
    // Clear the list control
    GetListCtrl().DeleteAllItems();
	
	::EnterCriticalSection(&g_CriticalSection);

    for(int i = 0; i < iProcessCount; ++i)
    {
        pos = pProcessInfoList->FindIndex(i);
        pPe = pProcessInfoList->GetAt(pos);

        //::sprintf(szProcessID,       "%d", pPe->th32ProcessID);
        //::sprintf(szThreadCount,     "%d", pPe->cntThreads);
        //::sprintf(szParentProcessID, "%d", pPe->th32ParentProcessID);
        ::sprintf(szProcessID,       "%d", pPe->peProcessEntry.th32ProcessID);
        ::sprintf(szThreadCount,     "%d", pPe->peProcessEntry.cntThreads);
        ::sprintf(szMemoryUsage,     "%d", (pPe->stMemUsage)/1000);

        // Insert the processes in the list control
        GetListCtrl().InsertItem(i, pPe->peProcessEntry.szExeFile, 0);
        GetListCtrl().SetItemText(i, 1, szProcessID);
        GetListCtrl().SetItemText(i, 2, szThreadCount);
        GetListCtrl().SetItemText(i, 3, szMemoryUsage);
    }
    
    // Free the contents of the CProcessInfoList it had a opy of the internal 
    // PROCESSENTRY32's maintained
    pos = pProcessInfoList->GetHeadPosition();
    while (pos != (POSITION)0xcdcdcdcd && pos != NULL)
    {
        pPe = pProcessInfoList->GetNext(pos);

		if (pPe)
		{
			delete pPe;
		}
    }

	pProcessInfoList->RemoveAll();

    // Now delete the list itself, after deleteing it's contents (done just above)
    delete pProcessInfoList;
    pProcessInfoList = NULL;

	::LeaveCriticalSection(&g_CriticalSection);
}

void CRemoteAdminView::OnRButtonDown(UINT nFlags, CPoint point) 
{
    CListView::OnRButtonDown(nFlags, point);
    
    LVHITTESTINFO lvHitTestInfo = {0};
    lvHitTestInfo.pt = point;

    GetListCtrl().HitTest(&lvHitTestInfo);
    int iItemClicked = lvHitTestInfo.iItem;

    if (iItemClicked >= 0)
    {
        GetListCtrl().SetItemState(iItemClicked, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
        m_strLastClickedProcessID = GetListCtrl().GetItemText(iItemClicked, 1);

        CMenu menuProcess;
        menuProcess.LoadMenu(IDR_PROCESS_OPTIONS);
    
        CMenu* pMenu = menuProcess.GetSubMenu(0);
        CPoint pt = point;

        ClientToScreen(&pt);
        pMenu->TrackPopupMenu(TPM_LEFTALIGN, pt.x, pt.y, this);
    }
}

void CRemoteAdminView::OnEndProcess() 
{
    // Send a command to continue the thread that will execute the remote process
    SCommand cmd;
    cmd.m_bThreadExit = FALSE;
     
    TCHAR szProcessID[10] = _T("");
    ::strcpy(szProcessID, m_strLastClickedProcessID.GetBuffer(0));
    
    /*
    // Get the currently selected machine IP, from the tree
    TCHAR szTextIP[_MAX_PATH] = _T("");
    HTREEITEM hSelectedItem = ::GetMachineView()->GetTreeCtrl().GetSelectedItem();
    TVITEM tvItem = {0};
    
    tvItem.hItem   = hSelectedItem;
    tvItem.pszText = szTextIP;
    tvItem.mask    = TVIF_TEXT | TVIF_HANDLE ;

    ::GetMachineView()->GetTreeCtrl().GetItem(&tvItem);
    //CString strMachineIP = tvItem.pszText;
    CString strMachineIP = ::GetMachineView()->GetTreeCtrl().GetItemText(hSelectedItem);*/
    CString strMachineIP = MFC_DocView::GetMachineView()->GetSelectedItemTextInTreeView();

    BOOL bOk = FALSE;
    DWORD dwWritten = 0;
    
    
    HANDLE hRemoteAdminProcessKillPipe = GetDocument()->GetRemoteAdminProcessKillPipe(strMachineIP);

    if (hRemoteAdminProcessKillPipe != NULL)
    {
        bOk = ::WriteFile(hRemoteAdminProcessKillPipe, &cmd,        sizeof(SCommand), &dwWritten, NULL);
        bOk = ::WriteFile(hRemoteAdminProcessKillPipe, szProcessID, 10,               &dwWritten, NULL);

        TCHAR szMessage[_MAX_PATH] = _T("");
        DWORD dwRead = 0;

        bOk = ::ReadFile(hRemoteAdminProcessKillPipe, szMessage, sizeof(szMessage), &dwRead, NULL);

        // There is some message that the process triggering was not sucessful
        // If it had been the string would be ""
        if (::strcmp(szMessage, _T("")) != 0)
        {
            CString strFormattedErrorMsg = ErrorHandling::ConvertStringTableIDToErrorMsg(strMachineIP, IDS_NOT_END_REMOTE_PROCESS);
            ::AfxMessageBox(strFormattedErrorMsg);
        }
    }
}

⌨️ 快捷键说明

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