gpt4 book ai didi

c++ - Windows 7共享内存的奇怪错误

转载 作者:行者123 更新时间:2023-11-28 02:24:22 25 4
gpt4 key购买 nike

尝试学习 Windows 7 共享内存的一些基础知识。我基于一个示例创建了以下内容,当我运行它时它编译得很好

c:\temp> a.exe  tmp.txt 85

它并没有像我预期的那样从文件中生成 10 个字节,相反,它只是打印了 10 个空字节。知道为什么吗?

谢谢

==============这里是测试程序=============

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>


int _tmain(int argc, char *argv[])
{
HANDLE hMapFile;
LPCTSTR pBuf;
//printf("argv[1] %s\n", argv[1]); exit(0);
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READONLY, // read/write access
0, // maximum object size (high-order DWORD)
atoi(argv[2]), // maximum object size (low-order DWORD)
argv[1]); // name of mapping object

if (hMapFile == NULL)
{
_tprintf(TEXT("Could not create file mapping object (%d).\n"),
GetLastError());
return 1;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_READ, // read/write permission
0,
0,
atoi(argv[2])); //BUF_SIZE);

if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());

CloseHandle(hMapFile);

return 1;
}
int i;
for (i=0; i<10; i++) {
printf("%02x ", pBuf[i]);
}
printf("\n");
return 0;
}*

最佳答案

您正在打印空内存,这就是您看到空值的原因。你必须在内存中放入一些东西才能得到零以外的东西。正如您在 MapViewOfFile 文档中所见,页面文件的映射 View 始终初始化为仅包含零。

您已经正确地在内存中分配了一个由页面文件支持的只读部分。您将无法写入它,因为它是只读的。但是,如果要使其可写,则可以将一些字节写入内存,然后再读回。

相反,您可以使用现有文件来支持映射,并且假设该文件不为空,您将能够从该文件中读取字节。看起来,根据您调用程序所用的参数,您正在尝试映射 tmp.txt。如果是这种情况,您需要使用 CreateFile 打开该文件,然后将生成的 HANDLE 作为第一个参数传递给 CreateFileMapping。执行此操作后,输出应与文件的内容相匹配。

下面的代码假定一个 64 位系统和一个全 ASCII 文件名。它也不会从 CreateFileA、CreateFileMappingA 或 MapViewOfFile 中清除资源。

void map_file(const char * fname) {
HANDLE file = CreateFileA(fname, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (file == INVALID_HANDLE_VALUE) {
throw runtime_error("Unable to open file");
}

LARGE_INTEGER file_size = {0};
if (!GetFileSizeEx(file, &file_size)) {
throw runtime_error("Unable to get file size");
}

if (file_size.QuadPart == 0) {
throw runtime_error("File cannot be empty");
}

HANDLE mapping = CreateFileMappingA(file, NULL, PAGE_READONLY, 0, 0, NULL);
if (mapping == nullptr) {
throw runtime_error("Unable to map file");
}

uint8_t * view = (uint8_t *) MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, (size_t) file_size.QuadPart);
if (view == nullptr) {
throw runtime_error("Unable to map view of file");
}

// do something with 'view'
}

关于c++ - Windows 7共享内存的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31237116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com