0

MapViewOfFile の戻り値 (void へのポインターを知っている限り) を自分のクラスに「キャスト」して、このオブジェクトを操作できるようにしたいと考えています。記憶がどのように構成されているかを知っています。headerSize はバイト番号 4 からバイト番号 8 にあり、バイトには 16 進数の値 (たとえば 16 進数 47) が書き込まれるため、サイズは 71 バイトである必要があります。属性「headerSize」の値として 71 を取得したいと考えています。私のスニペットで「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 の戻り値を自分の構造体にキャストしようとしています。

main.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;
}
4

1 に答える 1

1

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;
}
于 2013-11-04T19:20:16.000 に答える