C ++ MapViewOfFile失败

我正在尝试使用VS2010在Windows上存储映射文件。 我正在做一个DLL。 DLL的第一个实例很好地映射文件。 同一过程中的第二个实例

*ppvData = ::MapViewOfFile( *phMapping, FILE_MAP_READ, 0, 0, 0 ); 

失败,错误“没有足够的内存可用于此命令”。 我不知道为什么会发生这种情况。

如果我映射2个不同的文件,而不是两个相同的文件,所有工作正常,所以我不相信“内存不足”的错误消息。

谢谢。

 hr = MapFile(sPath, &m_hVoiceData, &m_pVoiceData,wsErr ); HRESULT CTTSEngObj::MapFile( wstring uPath, // Value that contains file path HANDLE * phMapping, // Pointer to file mapping handle void ** ppvData, // Pointer to the data wstring &uError) { HRESULT hr = S_OK; CSpDynamicString dstrFilePath(uPath.c_str()); if ( SUCCEEDED( hr ) ) { bool fWorked = false; *phMapping = NULL; *ppvData = NULL; HANDLE hFile; #ifdef _WIN32_WCE hFile = CreateFileForMapping( dstrFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); #else hFile = CreateFile(CW2T(dstrFilePath), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); #endif if (hFile != INVALID_HANDLE_VALUE) { *phMapping = ::CreateFileMapping( hFile, NULL, PAGE_READONLY, 0, 0, NULL ); if (*phMapping) { *ppvData = ::MapViewOfFile( *phMapping, FILE_MAP_READ, 0, 0, 0 ); if (*ppvData) { fWorked = true; } else { uError=GetLastErrorStdStrW(); } } else { uError=L"mapfile: fm failed"; } ::CloseHandle( hFile ); } else { uError=L"mapfile: invalidhandle"; } if (!fWorked) { hr = HRESULT_FROM_WIN32(::GetLastError()); if (*phMapping) { ::CloseHandle(*phMapping); *phMapping = NULL; } } } else { uError=L"mapfile: dynstr"; } return hr; } /* CTTSEngObj::MapFile */ 

这是如何宣布的:

 class ATL_NO_VTABLE CTTSEngObj : public CComObjectRootEx<CComMultiThreadModel>, public CComCoClass<CTTSEngObj, &CLSID_SampleTTSEngine>, public ISpTTSEngine, public ISpObjectWithToken { private: CComPtr<ISpObjectToken> m_cpToken; HANDLE m_hVoiceData; void* m_pVoiceData; 

您请求将整个文件映射到内存中。 它有多大? 未分配进程的地址空间可能没有足够大的连续范围。