C ++ MapViewOfFile schlägt fehl

Ich versuche, eine Datei unter Windows mit VS2010 zu speichern. Ich mache das in einer DLL. Die erste Instanz der DLL ordnet die Datei einwandfrei zu. Die zweite Instanz innerhalb desselben Prozesses bewirkt

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

mit dem Fehler "Nicht genügend Speicher für diesen Befehl verfügbar" fehlschlagen. Ich bin mir nicht sicher, warum das passiert.

Wenn ich 2 verschiedene Dateien anstelle der doppelten Datei zuordne, funktioniert alles einwandfrei, sodass ich der Fehlermeldung "Nicht genügend Speicher" nicht vertraue.

Vielen Dank.

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 */

Und so wird es erklärt:

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;

Antworten auf die Frage(1)

Ihre Antwort auf die Frage