当前位置:首页 > 内存 > 正文

vc进程间共享内存

  • 内存
  • 2024-06-30 08:35:56
  • 2322

一、关于VC++的一个问题从其他程序获取窗口数据有两种方法:
1.通过OpenProcess()打开进程,然后在进程内存空间中分配内存,并将获得的数据存储在这块内存中。。然后使用ReadProcessMemory()将数据读入您自己的进程中。
2.安装一个挂钩。该钩子必须位于dll中。一旦进程加载了这个钩子,它就可以读写进程的内存空间到dll中。对于共享内存来说是等价的。
不过需要注意的是,这些直接获取窗口数据的方法对于当前的QQ登录框是无效的。目前的QQ登录框密码文本框是专门设计的。也许QQ本身就是一个钩子。被挂接到此文本框以拦截来自键盘的所有消息。事实上,文本框收不到任何消息!
所以如果你想获取QQ密码,只能通过全局钩子来记录键盘和鼠标输入。
二、vc无法共享数据DLL只是运行代码。DLL中分配的空间属于其所在进程,代码也在该进程中执行。进程是操作系统分配资源的单位。进程之间不共享内存区域。每个进程都有自己的运行区和内存分配区。因此DLL中的东西不被共享。
三、vc共享内存Filemapping问题哈,初学者。。。
您没有检查关键函数是否执行成功。你怎么知道你的内存映射成功了?。
内存映射通常用于进程间通信,线程间通信的方法太多。。。
我将发布2个MSDN示例给您:
//示例1
#include
#include
#include
#defineBUF_SIZE256
TCHARszName[]=TEXT("Global\\MyFileMappingObject");
TCHARszMsg[]=TEXT("Messagefromfirstprocess");
intmain()
{
HANDLehMapFile;
LPCTSTRpBuf;
hMapFile=CreateFileMapping(
INVALID_HANDLE_VALUE,//使用分页文件
NULL,//默认安全性
PAGE_READWRITE,//读/写访问
0,//size
BUF_SIZE,//缓冲区大小
szName);//nameofmappingobject
if(hMapFile==NULL)
{
printf("Couldnotcreatefilemappingobject(%d).\n",
GetLastError());
return1;
}
pBuf=(LPTSTR)MapViewOfFile(hMapFile,//处理map对象
FILE_MAP_ALL_ACCESS,//读/写权限
0,
0,
BUF_SIZE);
if(pBuf==NULL)
{
printf("Couldnotmapviewoffile(%d).\n",
GetLastError());
return2;
}
CopyMemory((PVOID)pBuf,szMsg,strlen(szMsg));
_getch();
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return0;
}
////////////////////////////////////////////////////////////////////////
//示例2
#include
#include
#include
#defineBUF_SIZE256
TCHARszName[]=TEXT("Global\\MyFileMappingObject");
intmain()
{
HANDLEhMapFile;
LPCTSTRpBuf;
hMapFile=OpenFileMapping(
FILE_MAP_ALL_ACCESS,//读/写访问
FALSE,//不继承thename
szName);//nameofmappingobject
if(hMapFile==NULL)
{
printf("Couldnotopenfilemappingobject(%d).\n",
GetLastError());
return1;
}
pBuf=(LPTSTR)MapViewOfFile(hMapFile,//处理map对象
FILE_MAP_ALL_ACCESS,//读/写权限
0,
0,
BUF_SIZE);
if(pBuf==NULL)
{
printf("Couldnotmapviewoffile(%d).\n",
GetLastError());
return2;
}
MessageBox(NULL,pBuf,TEXT("Process2"),MB_OK);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return0;
}