加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

利用windows api共享内存通讯

发布时间:2020-12-14 03:55:23 所属栏目:Windows 来源:网络整理
导读:主要涉及CreateFile,CreateFileMapping,GetLastError,MapViewOfFile,sprintf,OpenFileMapping,CreateProcess CreateFile 获得文件Handle CreateFileMapping创建Handle的映射 MapViewOfFile在进程的虚拟地址空间,部分的表示上面的映射(可以是一部分,

主要涉及CreateFile,CreateFileMapping,GetLastError,MapViewOfFile,sprintf,OpenFileMapping,CreateProcess

CreateFile 获得文件Handle

CreateFileMapping创建Handle的映射

MapViewOfFile在进程的虚拟地址空间,部分的表示上面的映射(可以是一部分,最大是完全的映射,不会再大)

CreateProcess创建进程

参考:

百度百科的sprintf。MapOfview

CreateFile函数详解(确实很详细) - findumars - 博客园??CreateFileMapping

MapViewOfFile - 简书? ??Windows进程间通信--共享内存映射文件(FileMapping)--VS2012下发送和接收 - 啦啦风吹 - 博客园

C++从文件中读取整数输入数据 - charlsonzhao的博客 - CSDN博客

创建进程参考:CreateProcess()函数详解 - 夜空中最亮的星 - CSDN博客?windows下创建进程,CreateProcess()详解及用法 - System Architect - CSDN博客?CreateProcess()函数详解 - 夜空中最亮的星 - CSDN博客?CreateProcess示例 - Hisin Wang的专栏 - CSDN博客

主要内容:

使用Win32 API设计两个利用共享内存通信的程序。生产者进程生成Catalan序列,并写入内存共享对象。消费者进程从共享内存读取并输出序列。

生成的Catalan数的数目由命令行指定。

Catalan数的性质:

?h(n)=h(n-1)*(4*n-2)/(n+1); ?h(n)=C(2n,n)/(n+1) (n=0,1,2,...) ?h(n)=c(2n,n)-c(2n,n-1)(n=0,...)

h(0)=1,h(1)=1 ?h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)

简单的求法:若令f(2)=f(3)=1,则f(n+1)=f(n)* (4*n-6)/n 。但是这里4*n-6/n会有除不尽。

可以catalan[i]*(4*j-6)/j

?

主要涉及CreateFile,CreateFileMapping,GetLastError,MapViewOfFile,sprintf,OpenFileMapping,CreateProcess函数。

函数的作用:

CreateFile 获得文件Handle

CreateFileMapping创建Handle的映射

MapViewOfFile在进程的虚拟地址空间,部分的表示上面的映射(可以是一部分,最大是完全的映射,不会再大)

CreateProcess创建进程。

各函数的参数及作用:

HANDLE CreateFile(?LPCTSTR lpFileName,????//?指向文件名的指针??DWORD dwDesiredAccess,????//?访问模式(写?/?读)??DWORD dwShareMode,????//?共享模式??LPSECURITY_ATTRIBUTES lpSecurityAttributes,?//?指向安全属性的指针??DWORD dwCreationDisposition,???//?如何创建??DWORD dwFlagsAndAttributes,???//?文件属性??HANDLE hTemplateFile????//?用于复制文件句柄?);

HANDLE WINAPI CreateFileMapping(

??_In_ ????HANDLE ???????????????hFile,

??_In_opt_ LPSECURITY_ATTRIBUTES lpAttributes,

??_In_ ????DWORD ????????????????flProtect,

??_In_ ????DWORD ????????????????dwMaximumSizeHigh,

??_In_ ????DWORD ????????????????dwMaximumSizeLow,

??_In_opt_ LPCTSTR ??????????????lpName

);

HANDLE CreateFileMapping(

? HANDLE hFile,?????????????????????? //物理文件句柄

? LPSECURITY_ATTRIBUTES lpAttributes,//安全设置

? DWORD flProtect,??????????????????? //保护设置

? DWORD dwMaximumSizeHigh,??????????? //高位文件大小(因为我们的游戏是32位的,所以此处设为 0)

? DWORD dwMaximumSizeLow,???????????? //低位文件大小

? LPCTSTR lpName????????????????????? //共享内存名称

);

BOOL CreateProcess(

 LPCTSTR lpApplicationName,// 应用程序名称

 LPTSTR lpCommandLine,// 命令行字符串

 LPSECURITY_ATTRIBUTES lpProcessAttributes,// 进程的安全属性

 LPSECURITY_ATTRIBUTES lpThreadAttributes,// 线程的安全属性

 BOOL bInheritHandles,// 是否继承父进程的属性

 DWORD dwCreationFlags,// 创建标志

 LPVOID lpEnvironment,// 指向新的环境块的指针

 LPCTSTR lpCurrentDirectory,// 指向当前目录名的指针

 LPSTARTUPINFO lpStartupInfo,// 传递给新进程的信息

 LPPROCESS_INFORMATION lpProcessInformation // 新进程返回的信息

);

?

遇到的问题:

1. CreateFileMapping出错

解决:GetLastError获得错误信息,发现是文件大小的参数错误,不应该为0.调整后解决(书上0,0是因为如果已经存在文件,那么会映射真实大小)

2. 如何按输入到视图遇到了问题

解决:

for(int i=0;i<sizek;i++)

{

Int;

t=sprintf((char*)lpMapAddress+j,"%drn",catalan[i]); j+=t; }

3. 如何输出的问题

解决:直接采用printf %s输出

就是参考《操作系统概念第七版》P301的例子,写了两个程序。(虽然我觉得书上的确实有点问题,坑了我一个小时)

中间遇到的最大问题就是一开始忘了做错误检查,结果在CreateFileMapping就出错了,而我还傻乎乎的去找sprintf的问题,浪费了一个小时。

还有写输出程序的时候,有点想炫点c++ 的东西,结果turned out to be wasting time. 所以说编程的目的是解决问题,而不是秀自己。

还有体会深刻的一点:一定要仔细的分析函数的参数,弄清楚作用。比如CreateFileMapping中就有指定映像大小的参数,如果设为0就会导致问题(而且编译器不报错的)。(GetLastError 1006)

源码:

?


?

?


?

?


?

?


?

效果图:

?


?

?


?

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读