簡體   English   中英

C ++ MapViewOfFile失敗

[英]C++ MapViewOfFile fails

我正在嘗試使用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;

您要求將整個文件映射到內存中。 它有多大? 未分配進程的地址空間可能沒有足夠大的連續范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM