共用內存vc++技術

一、進程之間數據的共享:共用內存vc++技術

選自:http://www.xici.net/d49241289.htm

進程之間數據的共享可以用共用內存實現,在Win32中,進程之間共享內存使用的事映射文件。虛擬內存系統具有把實際內存映射到頁文件或者交換文件的能力。用戶可以把內存映射到任何的映射文件中,包括系統內存頁。而利用系統內存頁可以實現快捷的內存共享。
     利用共有內存實現進程之間的數據共享共有兩部:
一.    使用CreateFileMapping函數創建內存映射文件。此函數需要文件句柄,對於大多數的內存共享應用程序,建此文件句柄設置爲0xFFFFFFFF即可。這樣的句柄指向系統內存頁文件。
二.    映射文件文件創建成功以後,以其返回的句柄作爲參數,調用MapViewOfFile函數爲內存映射文件對象創建視,MapViewOfFile函數將返回指向文件的視指針。可以利用此視指針對內存映射文件進行操作,內存的讀寫簡化到了就像普通變量的操作。
 
下面是一個利用共有內存實現進程之間的數據共享的Sample程序。
//寫內存程序 
//MemWrite.cpp
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
class student
{
public:
 long ID;
 char name[20];
};
void main()
{
 HANDLE hMemShare;
 student stu;
    int stu_num = 30;
 student *lpstu;
 stu.ID = 99041232;
 strcpy(stu.name,"SecBug");
 hMemShare = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,sizeof(student),"TestMemShare");
 if(hMemShare == NULL)
 {
  cout<<"Failed to Alloocate"<<endl;
  return;
 }
 lpstu = (student *)MapViewOfFile(hMemShare, FILE_MAP_WRITE,0,0,sizeof(student));
 if(lpstu == NULL)
 {
  cout<<"Failed to Map"<<endl;
  return;  
 }
 *lpstu = stu;
 while(1){}
 UnmapViewOfFile(lpstu);
}
 
//讀內存程序
 
// MemRead.cpp
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
class student
{
public:
 long ID;
 char name[20];
};
void main()
{
 HANDLE hMemShare;
 student stu;
 student *lpstu;
 char *lpTch;
 stu.ID = 0;
 strcpy(stu.name ,"tst");
 hMemShare = OpenFileMapping(FILE_MAP_READ,FALSE,"TestMemShare");
 if(hMemShare == NULL)
 {
  cout<<"File Created Failed"<<endl;
  return;
 }

 lpstu = (student *)MapViewOfFile(hMemShare, FILE_MAP_READ,0,0,sizeof(student));
 if(lpTch == NULL)
 {
  cout<<"Failed to Map"<<endl;
  return;
 }
 stu = *lpstu;
 cout<<stu.ID<<endl;
 cout<<stu.name<<endl;
 UnmapViewOfFile(lpstu);
}
 
二、共享內存實現進程間大數據的交換
三、Windows進程間通信的各種方法   共介紹了13種,也有一些具體實現的連接,比較不錯
四、實時交互應用架構——進程間高效通信方式問題   只是提問式的回答  socket.io開發
五、進程間通信方式中一般公司用的最多的是哪幾個?做嵌入式的 百度提問

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章