【问题标题】:Mapping only first letter of file C仅映射文件 C 的第一个字母
【发布时间】:2019-06-18 10:59:59
【问题描述】:

如何仅映射文件的第一个字母??
我已经为参数尝试了这些值:

1, // maximum object size (high-order DWORD) 
1, // maximum object size (low-order DWORD)

(我不知道它们之间的区别)。

对于只有 1 个字母的映射来说,1 是正确的参数吗?

#define FILENAME "c:\gibrish.bin" 
#include <Windows.h>
#include <stdio.h>
int main()
{
  HANDLE hFile;
  LPCSTR pFileName = FILENAME;
  hFile = CreateFileA(pFileName, // file name 
                      FILE_MAP_ALL_ACCESS, // access type 
                      0, // other processes can't share
                      NULL, // security
                      OPEN_EXISTING, // open only if file exists
                      FILE_ATTRIBUTE_NORMAL, NULL);
  HANDLE hMapFile;

  ////////mapping here
  hMapFile = CreateFileMappingA(hFile, // file handle
                                NULL, // default security
                                FILE_MAP_ALL_ACCESS, // read access 
                                1, // maximum object size (high-order DWORD) 
                                1, // maximum object size (low-order DWORD)
                                   // 0 means map the whole file 
                                "gibrishFile"); // name of mapping object, in case we 
                                                // want to share it


  return 0;
}

【问题讨论】:

  • 第一行已经有问题:"c:\gibrish.bin" 应该是"c:\\gibrish.bin"。而且您不会进行任何错误检查。
  • @Jabberwocky 好的,谢谢,但你能回答这个问题吗?
  • 如果节由普通文件支持,MaximumSize 指定文件可以扩展或映射到的最大大小。如果您将其设置为小于当前文件大小的值 - 它没有效果。并且截面视图总是取整 PAGE_SIZE 的倍数。你不能映射 1 个字节。视图将是最小的PAGE_SIZE(4096 字节)

标签: c file dictionary winapi mapping


【解决方案1】:

如何只映射文件的第一个字母? 我已经为参数尝试了这些值:

1, // maximum object size (high-order DWORD) 
1, // maximum object size (low-order DWORD)

这两个参数构成(一个巨大的)数字,如果您要给出的数字是 1 或 2^32 以下的任何其他数字,high-order DWORD 必须为 0。如果您给出 1 和 1,则表示数字是 1* (2^32) + 1 = 4294967296,这与仅第一个字母不兼容

来自https://docs.microsoft.com/en-us/windows/desktop/winprog/windows-data-types

DWORD 32 位无符号整数。范围是 0 到 4294967295(十进制)。

【讨论】:

  • 那么,为了只得到第一个字母,我应该这样写吗? 0, // 最大对象大小(高位 DWORD) 1, // 最大对象大小(低位 DWORD)
  • @Mayuu 是的,就是这样
  • @Mayuu 除了这个答案:在你的代码中添加错误检查,CreateFileACreateFileMappingA 可能会失败。您需要检查这些函数的返回值。仔细阅读文档。 CreateFileA 在失败时返回 INVALID_HANDLE_VALUECreateFileMappingA 在失败时返回 NULLGetLastError() 返回错误代码。仔细阅读文档。
  • @Jabberwocky 感谢您的建议。我添加了错误检查,发现 CreateFileA 如您所说返回了 INVALID_HANDLE_VALUE 。这可能是什么原因?
  • @Mayuu - 阅读您帖子下的第一条评论。如果您想知道原因,请致电RtlGetLastNtStatus() 和/或GetLastError()
【解决方案2】:

CreateFileMappingAmsdn doc 中没有参数FILE_MAP_ALL_ACCESS。返回值将始终失败,GetLastError() 返回 87(ERROR_INVALID_PARAMETER)。而你访问的文件夹是“C:\\”,如果你没有足够的权限,CreateFileA会返回一个INVALID_HANDLE_VALUE并得到错误5(ERROR_ACCESS_DENIED)。

CreateFileMappingA 用于创建映射空间,但不是您要映射的实际大小。然后使用MapViewOfFile() 映射到调用进程的地址空间。并且您要映射的大小必须

【讨论】:

    猜你喜欢
    • 2020-12-18
    • 2020-10-15
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2020-08-19
    • 2017-08-24
    相关资源
    最近更新 更多