2017-06-09 38 views
0

如何將共享內存分配給如下的靜態緩衝區,但使用CreateFileMapping和MapViewOfFile。使用MapViewOfFile分配靜態共享內存

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

的目標是創建一個爲C++和FORTRAN應用程序共享,就像使用data_seg時的完成靜態共享緩存。當創建一個動態分配的緩衝區時,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); 

這兩個應用程序必須調用CreateFileMapping()具有相同lpName值,以獲得在系統內核訪問相同的映射對象。無論哪個應用程序首先調用CreateFileMapping()都會創建該對象,而第二個應用程序將獲取現有對象的句柄。然後,MapViewOfFile()將調用進程中的內存訪問映射到該對象。通過這種方式,兩個應用程序都可以使用共享內存。當一個應用程序將數據寫入對象時,另一個應用程序將會看到它。

+0

我知道如何創建共享文件映射,但問題是我不想要動態指針(char * buffer)。可能我想要的是不可能的。 – user3716892

+0

@user:這沒什麼意義。這個答案中的指針「緩衝區」與問題中的「緩衝區」數組之間幾乎沒有區別。如果您絕對需要以數組的形式訪問文件映射對象,則可以輕鬆地將指針轉換爲對數組類型的引用。或者只需索引指針。 'buffer [0] ='A';'對於指針和數組是合法的。 – IInspectable

+0

@IInspectable:你說的C和C++是真實的,但請記住,OP是問Fortran。 –