关于 内存映射文件 操作的一个问题
vb吧
全部回复
仅看楼主
level 11
余思培
楼主
我在学习内存映射文件的时候,
从CreateFile到MapViewOfFile能够成功,从UnMapViewOfFile 到 CloseHandle能成功,but......怎么进行内存操作的时候......就不会了,请问一下各位大佬,怎么进行内存操作?
2020年10月25日 14点10分
1
level 11
余思培
楼主
自顶一下,请问怎么往内存映射文件写入数据以及从内存映射文件读取数据
2020年10月26日 00点10分
2
level 13
隨風🍁缒夢
MapViewOfFile后得到一个内存指针用,CopyMemory就可以读取和写入,如果会用安全数组SafeArray的话也可以,操作量大时比CopyMemory效率高
2020年10月26日 01点10分
3
余思培
我现在出的问题也就是卡在CopyMemory,不知道怎么获取正确的内存待写入数据内存指针,不知道应该是以byte数组的形式写入还是以字符串的形式写入
2020年10月26日 01点10分
level 13
隨風🍁缒夢
Byte、Integer、Long数组都可以,字符串也可以得到字节数组的,字符串可以得到Unicode格式的字节数组,或者Ansi的。我上面提的安全数组SafeArray并不是VB的普通数组,安全数组通过CopyMemory后,安全数组pvData指向内存指针后可以随意读取和写入,对映射后的指针写入后需要调用FlushViewOfFile才会将写入的数据更新到实际文件中
2020年10月26日 01点10分
4
余思培
SafeArray相关概念以前没有接触过,我去搜索和查阅一下相关内容,然后再据此再尝试一下。
2020年10月26日 06点10分
level 13
隨風🍁缒夢
如果觉得太难,可以用ReadFile、WriteFile操作文件,不需要文件映射,我测试中感觉两者差距也不是很明显,基本感觉不出来,或许现在电脑的配置好了。理论上文件映射效率高,比如200M的文件,文件映射后就是你操作哪部分数据(比如100-150M之间的数据),它只载入100-150M之间的数据到内存,当你操作完整个文件后,200M的文件才会完整载入内存
2020年10月26日 01点10分
5
level 11
余思培
楼主
中午再次尝试了一下,发现可以读取数据(之前应该也能,只是没去尝试)。但是用Copymemory去写数据时,Copymemory这个函数就中断了(就像是我把参数传过去了,函数也执行了,但是处理器找不到正确调用者的代码段位置了,不能正常执行后续代码,就像是处理时丢失了调用者的地址(一般的调用都会把调用者的当前代码处理位置的地址压入栈中吧,感觉就像存入栈的地址丢失了))
部分代码和运测截图如下
2020年10月26日 06点10分
6
余思培
@jy497759649
多谢大佬,之前没发现这儿出了问题
2020年10月26日 07点10分
level 13
隨風🍁缒夢
MapViewOfFile和CreateFile的参数有点一样,既然CreateFile中用了Write和Read,MapViewOfFile要写入数据需要指定FILE_MAP_WRITE,你只指定了FILE_MAP_READ当然只能读取
2020年10月26日 07点10分
7
1