从 MapViewOfFile() 的返回值构造自己的对象

Construct own object from return value of MapViewOfFile()

本文关键字:自己的 对象 返回值 MapViewOfFile      更新时间:2023-10-16

我想将 MapViewOfFile 的返回值(据我所知是指向 void 的指针)"强制"到我自己的类,以便我能够使用此对象。我知道记忆是如何构建的。headerSize 位于字节号 4 到字节编号 8,十六进制值写在字节中,例如十六进制 47,因此大小应为 71 字节。我想获取 71 作为我的属性"headerSize"的值。什么代码必须替换我的代码片段中的"TODO"?我不知道如何读取字节以及如何创建属性。

main.cpp中的代码:

// MapViewOfFile return a pointer to void, so you need to cast it to a suitable structure 
pBuf = (FILE*) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
// create object
JobaShm jobaShm(pBuf);
int headerSize = jobaShm.getHeaderSize();
std::cout << " HeaderSize " << headerSize << ";n";

在 jobashm.h 中编写代码

#ifndef JOBASHM_H
#define JOBASHM
class JobaShm {
public:
    JobaShm(FILE* handle);
    int getHeaderSize();
private:
    int headerSize;
};
#endif 

在 jobashm 中编写代码.cpp

#include <stdio.h>
#include "jobashm.h"
JobaShm::JobaShm(FILE* handle){
    // TODO 
}
int JobaShm::getHeaderSize(){
    return headerSize;
}

更新:由于本教程 http://www.cplusplus.com/forum/general/54381/我正在尝试在我自己的结构中强制转换 MapViewOfFile 的返回值。

主.cpp

struct Shm {
    int firstByte;
};
int main(void){
    std::cout << "*** Start SharedMemory  ***n";
    HANDLE hMapFile;
    hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szName);              
    if (hMapFile == NULL){
        MessageBox(NULL, TEXT("Could not open file mapping object"), TEXT("ERROR"), MB_OK);
        return 1;
    }
    Shm * pBuf = (Shm *) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE); // ggf. besser size_of Shm, statt BUF_SIZE
    std::cout << " Debug  " << pBuf->firstByte << ";n";
    UnmapViewOfFile(&pBuf);
    CloseHandle(hMapFile);
    std::cout << "*** close app by typing a number. ***n";
    int a = 0;
    cin >> a;
    return 0;
}

我认为你必须阅读更多关于MapViewOfFile的信息。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx

它返回指向数据的指针。

LPCTSTR pBuf;
pBuf = (LPTSTR) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
JobaShm(pBuf)

然后,既然你知道数据是什么,你应该为它创建一个结构并强制转换它。

struct FileData {
    int space;
    int headerSize;
    // etc...
}
JobaShm::JobaShm(LPTSTR* pBuf) {
    FileData fd;
    CopyMemory((PVOID)pBuf, &fd, sizeof(fd));
    headerSize = fd.headerSize;
}