2016-10-10 9 views
-2

2つのプロセス間で共有メモリを作成したいと思います。共有メモリをマップできません

スニペット1:

#define BUF_SIZE 256 
TCHAR szName[] = TEXT("Global\\MyFileMappingObject"); 
TCHAR szMsg[] = TEXT("Message from first process."); 

void initSharedMem() { 
HANDLE hMapFile; 
LPCTSTR pBuf; 

hMapFile = CreateFileMapping(
    INVALID_HANDLE_VALUE, // use paging file 
    NULL,     // default security 
    PAGE_READWRITE,   // read/write access 
    0,      // maximum object size (high-order DWORD) 
    BUF_SIZE,    // maximum object size (low-order DWORD) 
    szName);     // name of mapping object 

if (hMapFile == NULL) { 
    MessageBox(0, "Could not create file mapping object", "Error", 0); 
    return; 
} 
pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object 
    FILE_MAP_ALL_ACCESS, // read/write permission 
    0, 
    0, 
    BUF_SIZE); 

if (pBuf == NULL) { 
    MessageBox(0, "Could not map view of file", "Error", 0); 
    CloseHandle(hMapFile); 

    return; 
} 


CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR))); 
_getch(); 

UnmapViewOfFile(pBuf); 

CloseHandle(hMapFile); 

MessageBox(0, "Done init shared mem", "Done", 0); 
return; 
} 

スニペット2(その他の工程):

#define BUF_SIZE 256 
TCHAR szName[] = TEXT("Global\\MyFileMappingObject"); 
TCHAR szMsg[] = TEXT("Message from first process."); 

void readSharedMem() { 
HANDLE hMapFile; 
LPCTSTR pBuf; 

hMapFile = OpenFileMapping(
    FILE_MAP_ALL_ACCESS, // read/write access 
    FALSE,     // do not inherit the name 
    szName);    // name of mapping object 

if (hMapFile == NULL) { 
    MessageBox(0, L"Error", L"Could not open file mapping object", 0); 
    return; 
} 

pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object 
    FILE_MAP_ALL_ACCESS, // read/write permission 
    0, 
    0, 
    BUF_SIZE); 

if (pBuf == NULL) { 
    MessageBox(0, L"Error", L"Could not map file", 0); 

    CloseHandle(hMapFile); 

    return; 
} 

MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK); 

UnmapViewOfFile(pBuf); 

CloseHandle(hMapFile); 

return; 

MessageBox(0, L"Done", L"SharedMemoryDone", 0); 
} 

Iは、プロセスAの最初の関数呼び出して、取得従って私は単にマイクロソフトのページから切り取らコピー完了したメッセージしかし、後でreadSharedMem関数を呼び出すと、「ファイルマッピングオブジェクトを開くことができませんでした」というエラーメッセージが表示されます。

私はここで間違っていますか?

+0

共有メモリセクションを開くときにプロセスAはまだ生きていますか?さらに、 'OpenFileMapping'が失敗したときに、どんなエラーコードを取得しますか? – IInspectable

+1

ヒント:コードをコピー/ペーストするだけではありません。理想的には、コードを再入力して、理解できないものの意味を調べる必要があります。それが新しい概念を学ぶ方法です。 – CodeMouse92

+0

はい、両方とも生きており、エラーコードは2です。 – QDA

答えて

1

私はプロセスAの最初の関数を呼び出し、doneメッセージを取得します。

完了メッセージが表示されるまでに、ファイルマッピングオブジェクトは既に閉じられているため、存在しなくなりました。

私は後でreadSharedMem関数を呼び出すと、「ファイルマッピングオブジェクトを開くことができませんでした」というエラーメッセージが表示されます。

あなたは遅すぎました。まだ存在している間にファイルマッピングオブジェクトを開く必要がありました。おそらく、最初のスニペットの_getchへの呼び出しは、その時点で別のプログラムを実行してから、続行するにはキーを押すことになっています。

+0

それはそれだった、私は眠る前に同じと思った。私は今それを試み、 "Process2"とのメッセージボックスが表示されますが、別の問題が発生しました。メッセージボックスには、 "最初のプロセスからのメッセージ"ではなく、いくつかの中国語の文字があります。なぜ彼らは間違って解釈されますか? – QDA

+0

おそらく、以前のコメントのいくつかがあなたの問題かもしれないと示唆していたので、あなたはUnicodeの設定を使いこなしていたでしょう。 (レコードについては、常にUnicodeモードを使用する必要があります)。 –

関連する問題