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

📄 datarecvdlg.cpp

📁 《Windows应用程序捆绑核心编程》配套源码
💻 CPP
字号:
// DataRecvDlg.cpp : 实现文件.
//
#include "stdafx.h"
#include "DataRecv.h"
#include "DataRecvDlg.h"

#define BUFFER_SIZE  0x100        // 用内存地址通信时分配的最大内存.
#define WM_COMM      WM_USER+100

const UINT wm_nRegMsg=RegisterWindowMessage("reg_data");
const UINT wm_nMemMsg=RegisterWindowMessage("mem_data");

/////////////////////////////////////////////////////////////////////////////
// CDataRecvDlg dialog

CDataRecvDlg::CDataRecvDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDataRecvDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDataRecvDlg)
	m_strCopyData = _T("");
	m_strFileMap = _T("");
	m_strMem = _T("");
	m_strRegMsg = _T("");
	m_strUserMsg = _T("");
	m_strClipBoard = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDataRecvDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDataRecvDlg)
	DDX_Text(pDX, IDC_TEXT_COPYDATA, m_strCopyData);
	DDX_Text(pDX, IDC_TEXT_FILEMAP, m_strFileMap);
	DDX_Text(pDX, IDC_TEXT_MEM, m_strMem);
	DDX_Text(pDX, IDC_TEXT_REGMSG, m_strRegMsg);
	DDX_Text(pDX, IDC_TEXT_USERMSG, m_strUserMsg);
	DDX_Text(pDX, IDC_TEXT_CLIPBOARD, m_strClipBoard);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDataRecvDlg, CDialog)
	//{{AFX_MSG_MAP(CDataRecvDlg)
	ON_WM_COPYDATA()
	ON_MESSAGE(WM_COMM,OnUserReceiveMsg)
	ON_REGISTERED_MESSAGE(wm_nRegMsg,OnRegReceiveMsg) 
	ON_REGISTERED_MESSAGE(wm_nMemMsg,OnRegMemMsg) 
	ON_BN_CLICKED(IDC_RECV_FILEMAP, OnRecvFilemap)
	ON_BN_CLICKED(IDC_RECV_CLIPBOARD, OnRecvClipboard)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDataRecvDlg message handlers

BOOL CDataRecvDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	return TRUE;  // return TRUE  unless you set the focus to a control.
}

BOOL CDataRecvDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
{
	m_strCopyData=(LPSTR)pCopyDataStruct->lpData;

	// 获得实际长度的字符串.
	m_strCopyData=m_strCopyData.Left(pCopyDataStruct->cbData);

    // 更新数据.
	UpdateData(FALSE);
	return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}

void CDataRecvDlg::OnUserReceiveMsg(WPARAM wParam,LPARAM lParam)
{
	m_strUserMsg.Format("%d\n",int(lParam));
    // 更新数据.
	UpdateData(FALSE);
}

void CDataRecvDlg::OnRegReceiveMsg(WPARAM wParam,LPARAM lParam)
{
	m_strRegMsg.Format("%d\n",int(lParam));
    // 更新数据.
	UpdateData(FALSE);
}

void CDataRecvDlg::OnRegMemMsg(WPARAM wParam,LPARAM lParam)
{
	LPVOID lpBaseAddress=(LPVOID)lParam;

	// 把字符串写入hProcess进程的内存.
	HANDLE hProcess=GetCurrentProcess();

	char data[BUFFER_SIZE];
	ReadProcessMemory(hProcess, lpBaseAddress, data,BUFFER_SIZE, NULL);
	m_strMem=data;

	// 更新数据.
	UpdateData(FALSE);
}

void CDataRecvDlg::OnRecvFilemap() 
{
	// 创建内存映像对象.
	HANDLE hMapping; 
	LPSTR lpData; 
	hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,
		              NULL,PAGE_READWRITE,0,0x100,"MYSHARE"); 
	if(hMapping==NULL) 
	{ 
		AfxMessageBox("CreateFileMapping() failed.");
		return;
	}

	// 将文件的视图映射到一个进程的地址空间上,返回LPVOID类型的内存指针.
	lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0); 
	if(lpData==NULL) 
	{
		AfxMessageBox("MapViewOfFile() failed.");
		return;
	}
	
	// 给这段映像内存的数据赋给本地变量.
	m_strFileMap.Format("%s",lpData);

	// 释放映像内存.
	UnmapViewOfFile(lpData);
	
	// 更新数据.
	UpdateData(FALSE);
}

void CDataRecvDlg::OnRecvClipboard() 
{
	// 打开系统剪贴板.
	if (!OpenClipboard()) return; 

	// 判断剪贴板上的数据是否是指定的数据格式.
	if (IsClipboardFormatAvailable(CF_TEXT)|| IsClipboardFormatAvailable(CF_OEMTEXT))
	{
		// 从剪贴板上获得数据.
		HANDLE hClipboardData = GetClipboardData(CF_TEXT);
	
		// 通过给内存句柄加锁,获得指向指定格式数据的指针.
		char *pchData = (char*)GlobalLock(hClipboardData);
	
		// 本地变量获得数据.
		m_strClipBoard = pchData;
	
		// 给内存句柄解锁.
		GlobalUnlock(hClipboardData);
	}
	else
	{ 
		AfxMessageBox("There is no text (ANSI) data on the Clipboard.");
	}
	
	// 使用完后关闭剪贴板.
	CloseClipboard();

	// 更新数据.
	UpdateData(FALSE);
}

⌨️ 快捷键说明

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