• 締切済み
  • すぐに回答を!

共有メモリへのマッピング(MapViewOfFile)について

共有メモリについて(特にMapViewOffileについて)教えてください。 ある構造体と、あるデータAを共有メモリへマッピングしたい考えています。 構造体は、 typedef struct _Data { int length; long data; char mIntArrayData[256]; } Data; データAは、short型の配列(要素数はx*y*z,x,y,zはcsvファイル等から読み込む)で、サイズをdatasize = sizeof(short) * x * y * z;とします。 この2つを使って、 両方のデータを long AllDataSize = sizeof(Data) + datasizeとしました。 このサイズを使って、共有メモリのマップハンドルを hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,PAGE_READWRITE,AllDataSize,MAPPED_FILE_NAME);(MAPPED_FILE_NAMEは、 メモリマップドファイルの名前) で、生成しました。 生成はできたのですが、データAにアクセスするための下記のような時にマッピングに失敗してしまいました。 DWORD dwOffset = sizeof(DATA); short *pData = (short *)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, dwOffset, Bytes); (Bytesはマッピングしたいバイト数でsizeof(short)の倍数) 次のようなDATAにアクセスするマッピングには成功しています。 DWORD dwOffset = 0; DATA *pDATA = (DATA *)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, dwOffset, sizeof(DATA)); 色々なサイト等を調べて、考えてみたのですが、怪しいところはdwOffsetと、CreateFileMappingで、マッピングしたい全体のファイルサイズを、構造体とデータAのサイズの単純な足し算としているところと考えています。ただ、はっきりとした答えが全くわからないので、どうか御教授お願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数1607
  • ありがとう数6

みんなの回答

  • 回答No.1

dwFileOffsetLow がシステムの単位に合ってないんじゃないでしょうか? 起きているエラー値を調べ、MSDNのマニュアルを良く読んで、使い方に間違いが無いか考えた方が早いと思いますよ。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • CreateFileMapping について

    CreateFileMapping を使用し アプリケーション間のデータ共有プログラムを作成しています。 CreateFileMapping には構造体を登録し その構造体で 文字列配列を動的に確保したいのですが // 構造体 typedef struct {   char **huga; } HOGE; main ---------------------------------- // マップ map = CreateFileMapping(   (HANDLE)0xffffffff,   NULL,   PAGE_READWRITE | SEC_COMMIT,   0, sizeof(HOGE),   "MAP_NAME"); // ビュー data = ( HOGE * )MapViewOfFile( map, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(HOGE) ); // 初回 flag = ( GetLastError() == ERROR_ALREADY_EXISTS ); if ( !flag ) {   // 確保 1   data->huga = new char*[ 10 ];   for ( int i = 0; i < 10; i++ ) {     // 確保 2     data->huga[ i ] = new char[ 256 ]; sprintf_s( data->huga[ i ], 256, "[ %d ]", i );   } } // 確認 for ( int i = 0; i < 10; i++ ) {   MessageBox( NULL, data->huga[ i ], "MAP", MB_OK ); } 上記のようにすると 確保する前の構造体が Mappingされているのか データを共有することが出来ませんでした。 動的確保した文字列配列を共有するには どのように設計すれば宜しいでしょうか。 よろしくお願いします。

  • ファイルマッピングについて

    ファイルマッピングについての質問です。 現在CreatFileMapping、OpenFileMapping、MapViewOfFileをつかって EXE間のデータのやり取りをしているのですが、 このファイルマッピングを利用して構造体を やりとりする事は出来ないものでしょうか? 開発環境はWinNT4とVB6です。よろしくお願いします。

  • MapViewOfFile() はカウンタを進めない?

    Windows APIの質問です。 PINT GetShareInt() { ____HANDLE hmap = CreateFileMapping( ________INVALID_HANDLE_VALUE, NULL, ________PAGE_READWRITE, ________0, sizeof(int), ________TEXT("Share") ); ____PINT pi = (PINT)MapViewOfFile( ________hmap, FILE_MAP_WRITE, 0, 0, 0); ____CloseHandle(hmap); ____return pi; } こんな感じの関数で変数をプロセス間共有したいのですが、 ファイルマッピングオブジェクトが毎回生成されてしまい、 変数を共有できません。 先にCloseHandleするのは後の処理がUnmapViewOfFileするだけで すむからです。変則的ですが、MapViewOfFile呼び出ししている以上 hmapが指すカーネルオブジェクトは開放されないと思うのですが。 MapViewOfFileがカーネルオブジェクトの内部カウンタを進めていない、 ということでしょうか?それではマルチスレッドで扱えないような気が するのですが、私の認識のどこが間違っているのでしょうか? よろしくご指導お願い申し上げます。

  • ファイル読み込みエラーになる。

    ファイル読み込み時に読み込んだデータサイズと、それを格納するストラクタのsizeofで取得したサイズが異なる為エラーになってしまいます。 実際のデータ→10バイト 構造体→WORD、DWORD、DWORDの10バイト なのですが、 blRet = ReadFile(hNDFile[bFile], cpReadData, sizeof(構造体),&outFileSize, 0 ); とすると、構造体のsizeofの値が12になる為関数は戻り値1(エラー)で返ってきてしまいます。 取得した値自体は問題ないのですが。。 逆にこの問題を解決しようとして構造体宣言の部分を#pragma pack(push , 1)で囲うと、sizeof(構造体)の値は10バイトとなり、readfile関数は正常に終わるのですが、読み取ったデータの値が想定していないものになってしまいます。 何がおかしいかわからず困っています。。

  • MapViewOfFileについて教えて下さい

    C言語の初心者ですが、ファイルマッピングについて教えて頂きたいことがあります。 あるファイルをMapViewOfFileを使用し、複数タスクの共有メモリとして使用中に、 クローズせずに再マッピング(?)みたいなことはできないでしょうか? 例えば、マッピングするAというファイルの内容が、変数A=0、変数B=0、変数C=0、としてOpenFileMapping(FILE_MAP_ALL_ACCESS)されている。 次に、Bというファイルの内容が、Aファイルと変数名は変わらずで、 変数A=1、変数B=1、変数C=1、とします。 ここでAファイルをクローズ(他タスクが参照するかもしれないので)せずに、 AファイルをBファイルの内容にしたいということなのです。 こんなことは、やはりできないのでしょうか? もちろん、Aファイルがマッピングされているので、直接Aを変更すれば良いのですが、 ファイル内容が膨大なため、なんとか再マッピング(?)できればと思ったのです。 OSはWindows2000で、VC6.0になります。 わかりにくい文章で申し訳ございませんが、よろしくお願いします。

  • 構造体をファイルに出力できません

    はじめまして、お世話になります。 『ダイアログで取得したファイル名』を、含むData構造体をファイルとして書き込む場合に限り、ファイルが出力されません。 Data構造体の文字列file_nameが『ダイアログで取得したファイル名』でなければ正常に出力されます。また、関数の返値や書き込み後のFILE構造体の中身を読み込んで調べたりしましたが、見る限りエラーはありませんでした。 開発ツールはMicrosoft Visual Studio 2005を使用しています。 どうか皆さんの知恵を貸してください! お願いします! //ファイルとして出力する構造体 typedef struct { TCHAR file_name[256]; BYTE id; }Data; //ファイルを開くダイアログ void OpenFile(HWND hWnd, TCHAR file_name[]) { OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFilter = TEXT("png files {*.bmp}\0*.bmp\0") TEXT("all files {*.*}\0*.*\0\0"); ofn.lpstrFileTitle = (LPWSTR)file_name; ofn.nMaxFileTitle = CHAR_SIZE; ofn.lpstrFile = NULL; ofn.Flags = OFN_FILEMUSTEXIST; GetOpenFileName(&ofn); } //ファイルを書き込む void SaveData(Data save_file[]) { FILE *file; errno_t err; size_t write_num; //書き込む err = _tfopen_s(&file, TEXT("hoge.map"), TEXT("w+b")); if(err != 0) return; write_num = fwrite(save_file, sizeof(Data), 6, file); //きちんと書き込めているか確かめる Data chek_data[6]; fseek(file, 0L, SEEK_SET); fread(chek_data, sizeof(Data), 6, file); fclose(file); }

  • 引数に"1"を設定したのに関数内の変数では"0"として扱われてしまう。

    引数に"1"を設定したのに関数内の変数では"0"として扱われてしまう。 今自分が持っているICカードをH8マイコンで読み取り、そこから取れたユニーク番号をフラッシュロムに書き込むという下の関数プログラムをつくっています。 void card_data_proc(WORD data,BYTE group,WORD num,BYTE add) { BYTE *pData; if(add == TRUE) pSCard->cad[group].data[num] = data; else pSCard->cad[group].data[num] = 0x0000; pData = (BYTE *)SRAM_CARD_BUF; pData[sizeof(CARD_DB) - 1] = env_crc(pData,sizeof(CARD_DB) - 1); //flash_fs_write((DWORD)FLASH_CARD_ADDR - (DWORD)FLASH_BASE,(BYTE *)pSCard,sizeof(CARD_DB)); flash_fs_write((DWORD)FLASH_CARD_ADDR,(BYTE *)pSCard,sizeof(CARD_DB)); } 困っているのが、この関数を WORD data; BYTE MenuCardGroup; int cardindex; card_data_proc(data,MenuCardGroup,cardindex,1); このプログラムで呼び出した行く時の動作をデバッガでおってみたところ、引数に”1”を渡したはずのaddの変数がなぜか”0"になってしまっていて、card_data_proc関数のif文でTRUEの条件に行かないのです。 なぜこのようになるのか御存じの方いらっしゃいませんでしょうか? このような現象に遭遇した場合はどのような点を確認していったらよいのでしょうか?

  • 構造体の文字列データをファイルへ書き込む方法は?

    構造体の文字列データをファイルへ書き込む方法として、構造体のデータを一気に書き込まずに、データ毎に書き込むことを勉強としてやってみようとしました。 数字の場合はうまくいったのですが、文字列の場合が分かりません。 ご存知の方、よろしくお願いいたします。 <数字の場合> typedef struct { int m1, m2; } Data; fwrite(&data[i].m1, sizeof(int), 1, fp); fwrite(&data[i].m2, sizeof(int), 1, fp); <文字列の場合> #include <stdio.h> typedef struct { char m1[10], m2[10]; } Data; int main() { static Data data[3] = { { "a1", "b1"}, { "c1", "d1"}, { "e1", "f1"}, }; Data data2[10]; FILE *fp; int i, n; fp = fopen("file.dat", "wb"); if (fp == NULL) return 1; for (i = 0; i < 3; i++) { fwrite(&data[i].m1, sizeof(Data.m1[10]), 1, fp); ← sizeofでエラーが出る fwrite(&data[i].m2, sizeof(Data.m2[10]), 1, fp); } fclose(fp); 以下省略

  • 構造体の初期化の時にポインタを入れるにはどうしたらいいですか?

    構造体の初期化の時にポインタを入れるにはどうしたらいいですか? 例えば、このような構造体で↓ struct PACKET { uint16_t size; // データの長さ uint16_t *data; // データバイト列 }; 初期化の時にsizeとdataを入れるにはどうしたらいいのでしょうか? dataがuint16_t*じゃなくてchar*なら struct PACKET { uint16_t size; // データの長さ char *data; // データバイト列 }; struct PACKET p = { 5, "12345" }; というようにできるのですが・・・

  • HTKのヘッダについて

    HTKというツールキッドを使用しています。 HTKでは任意のデータを使ってHMMの学習ができるのですが、そのときにデータファイルに12バイトのヘッダを付加する必要があります。 この処理をc言語のプログラムでやろうとしているのですが、うまくいきません。 ヘッダは、long型long型short int型short int型という4つの情報で構成されていて、そのあとにfloat型のデータが続いています。 使用しているプログラムの一部は以下のようになっています。 out = fopen("outfile", "wb"); fwrite(&head1,sizeof(long),1,out); fwrite(&head2,sizeof(long),1,out); fwrite(&head3,sizeof(short),1,out); fwrite(&head4,sizeof(short),1,out); fwrite(data, sizeof(float), num, out); //data[]がデータ fclose(out); このプログラムで書き出したファイルでHTKのHInitを実行すると「ヘッダが読み込めない」というエラーがでてしまいます。 任意のデータをHTKフォーマットにするにはどうすればいいのでしょうか?教えてください。よろしくお願いします。