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

📄 datasenddlg.cpp

📁 《Windows应用程序捆绑核心编程》配套源码
💻 CPP
字号:
// DataSendDlg.cpp : 实现文件.
//
#include "stdafx.h"
#include "DataSend.h"
#include "DataSendDlg.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");

/////////////////////////////////////////////////////////////////////////////
// CDataSendDlg dialog

CDataSendDlg::CDataSendDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDataSendDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDataSendDlg)
	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 CDataSendDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDataSendDlg)
	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(CDataSendDlg, CDialog)
	//{{AFX_MSG_MAP(CDataSendDlg)
	ON_BN_CLICKED(IDC_SEND_COPYDATA, OnSendCopydata)
	ON_BN_CLICKED(IDC_SEND_USERMSG, OnSendUsermsg)
	ON_BN_CLICKED(IDC_SEND_REGMSG, OnSendRegmsg)
	ON_BN_CLICKED(IDC_SEND_MEM, OnSendMem)
	ON_BN_CLICKED(IDC_SEND_FILEMAP, OnSendFilemap)
	ON_BN_CLICKED(IDC_SEND_CLIPBOARD, OnSendClipboard)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDataSendDlg message handlers

BOOL CDataSendDlg::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.
}

void CDataSendDlg::OnSendCopydata() 
{
	UpdateData();  //更新数据.
	CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv")); // 查找DataRecv进程.
	if(pWnd==NULL){
		AfxMessageBox(TEXT("Unable to find DataRecv."));
		return;
	}

	COPYDATASTRUCT cpd; // 给COPYDATASTRUCT结构赋值.
	cpd.dwData = 0;
	cpd.cbData = m_strCopyData.GetLength();
	cpd.lpData = (void*)m_strCopyData.GetBuffer(cpd.cbData);
	pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);// 发送.
}

void CDataSendDlg::OnSendUsermsg() 
{
	UpdateData();  // 更新数据.
	CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv")); // 查找DataRecv进程.
	if(pWnd==NULL){
		AfxMessageBox(TEXT("Unable to find DataRecv."));
		return;
	}

	UINT uMsg;
	uMsg=atoi(m_strUserMsg);
	pWnd->SendMessage(WM_COMM,NULL,(LPARAM)uMsg);// 发送.
}

void CDataSendDlg::OnSendRegmsg() 
{
	UpdateData();  // 更新数据.
	CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv")); // 查找DataRecv进程.
	if(pWnd==NULL){
		AfxMessageBox("Unable to find DataRecv.");
		return;
	}
	UINT uMsg;
	uMsg=atoi(m_strRegMsg);
	pWnd->SendMessage(wm_nRegMsg,NULL,(LPARAM)uMsg);// 发送.
}


void CDataSendDlg::OnSendMem() 
{
	UpdateData();  // 更新数据.

	CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv")); // 查找DataRecv进程.
	if(pWnd==NULL){
		AfxMessageBox("Unable to find DataRecv.");
		return;
	}

	// 获取进程号.
	DWORD PID;
	GetWindowThreadProcessId(pWnd->m_hWnd, (DWORD*)&PID );
	HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS,FALSE,PID);

	// 分配虚拟内存.
	LPVOID lpBaseAddress;
	lpBaseAddress = VirtualAllocEx(hProcess, 0, BUFFER_SIZE, 
		          MEM_COMMIT, PAGE_READWRITE);		

	char  data[BUFFER_SIZE]; 
	strcpy(data,m_strMem);

	// 把字符串写入hProcess进程的内存.
	WriteProcessMemory(hProcess, lpBaseAddress, data, BUFFER_SIZE, NULL);

	// 发送基址给DataRecv进程.
	pWnd->SendMessage(wm_nMemMsg,NULL,(LPARAM)lpBaseAddress);

	// 等待接收程序接收数据.
	Sleep(100);

	// 释放虚拟内存.
	VirtualFreeEx(hProcess,lpBaseAddress, 0, MEM_RELEASE);
}

void CDataSendDlg::OnSendFilemap() 
{
	UpdateData();  // 更新数据.

	// 创建内存映像对象.
	HANDLE hMapping;   
	LPSTR lpData;   
	hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,
		                  PAGE_READWRITE,0,BUFFER_SIZE,"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;
	}

	// 给这段映像内存写数据.
	sprintf(lpData,m_strFileMap);   
	
	// 释放映像内存.
	UnmapViewOfFile(lpData);   
}

void CDataSendDlg::OnSendClipboard() 
{
	UpdateData();                    // 更新数据.
	CString strData=m_strClipBoard;  // 获得数据.

	// 打开系统剪贴板.
	if (!OpenClipboard()) return;

	// 使用之前,清空系统剪贴板.
	EmptyClipboard();

	// 分配一内存,大小等于要拷贝的字符串的大小,返回的内存控制句柄.
	HGLOBAL hClipboardData;
	hClipboardData = GlobalAlloc(GMEM_DDESHARE, strData.GetLength()+1);
	
	// 内存控制句柄加锁,返回值为指向那内存控制句柄所在的特定数据格式的指针.
	char * pchData;
	pchData = (char*)GlobalLock(hClipboardData);
	
	// 将本地变量的值赋给全局内存.
	strcpy(pchData, LPCSTR(strData));
	
	// 给加锁的全局内存控制句柄解锁.
	GlobalUnlock(hClipboardData);
	
	// 通过全局内存句柄将要拷贝的数据放到剪贴板上.
	SetClipboardData(CF_TEXT,hClipboardData);
	
	// 使用完后关闭剪贴板.
	CloseClipboard();
}

⌨️ 快捷键说明

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