2017-06-09 31 views
0

CreateFileMappingとMapViewOfFileを使用して、以下のように共有メモリを静的バッファに割り当てる方法を教えてください。MapViewOfFileを使用した静的共有メモリの割り当て

#pragma data_seg(".ABC") 
__declspec (dllexport) char buffer[10000] = {0}; 
#pragma data_seg() 
#pragma comment(linker, "-section:.ABC,rws") 

目標は、data_segを使用した場合、それが行われているように、C++やFORTRANのアプリケーション間で共有される静的な共有バッファを作成することです。ダイナミックに割り当てられたバッファを作成するときには、ポインタを参照解除する必要があるため、FORTRANは扱いにくくなりますが、これは実行可能ですが、必要なものではありません。

+0

実際の質問は何ですか? –

+0

'CreateFileMapping'と' MapViewOfFile'が何であるか知っていますか? –

+1

@JonathanMee:WinAPIの機能:[CreateFileMapping](https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v = vs.85).aspx)および[MapViewOfFile](https ://msdn.microsoft.com/en-us/library/windows/desktop/aa366761(v = vs.85).aspx)。 OP:あなたの目標は何ですか?もっと情報を提供してください。 –

答えて

1

同等のWin32 API呼び出しは次のようになります。

SECURITY_DESCRIPTOR sd; 
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); 
SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE); 

SECURITY_ATTRIBUTES sa; 
sa.nLength = sizeof(sa); 
sa.lpSecurityDescriptor = &sd; 
sa.bInheritHandle = FALSE; 

HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, 10000, TEXT("ABC")); 
if (!hMapping) ... // error handling 

char *buffer = (char*) MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 10000); 
if (!buffer) ... // error handling 

// use buffer as needed... 

UnmapViewOfFile(buffer); 
CloseHandle(hMapping); 

両方のアプリは、システムのカーネル内の同じマッピングオブジェクトへのアクセスを得るために同じlpName値でCreateFileMapping()を呼び出す必要があります。どちらのアプリでも最初にCreateFileMapping()と呼ばれるオブジェクトが作成され、2番目のアプリケーションは既存のオブジェクトのハンドルを取得します。次に、MapViewOfFile()は呼び出し元プロセス内のメモリアクセスをそのオブジェクトにマップします。このようにして、両方のアプリケーションが互いに共有メモリを使用しています。 1つのアプリがオブジェクトにデータを書き込むと、他のアプリはそのデータを表示します。

+0

共有ファイルマッピングを作成する方法はわかりましたが、問題は動的ポインタ(char *バッファ)を必要としないことです。おそらく私が望むものは不可能です。 – user3716892

+0

@user:これはあまり意味がありません。この答えのポインタ 'buffer'と質問の' buffer'配列にはほとんど違いがありません。ファイルマッピングオブジェクトに配列としてアクセスする必要がある場合は、ポインタを配列型への参照に簡単にキャストできます。ポインタを単に索引付けすることもできます。 'buffer [0] = 'A';'はポインタと配列に対して合法です。 – IInspectable

+0

@IInspectable:あなたの言うことはCやC++でも当てはまりますが、OPは代わりにFortranについて質問しています。 –

関連する問題