0

ファイルにデータを書き込むために、共有メモリ関数を使用しています。問題: 以下の関数を使用してファイルに 10MB のバッファーを書き込もうとすると、最初の反復でのみ書き込むことができ、2 回目の反復ではバッファーの次の部分をメモリに書き込むことができませんでした。何か提案があれば私を助けてください。または以下のコードに問題があります。私はこの部分だけをコントロールしています。CreateFileMapping を持つ他の部分を制御することはできません。

「dwFileOffsetLow」または「dwFileOffsetHigh」で変更する必要があるもの。2 回目の反復以降、"MapViewOfFile" は null を返します。MapViewOfFile の異なる範囲を繰り返し呼び出す必要があるため、入力を得た場所があります。しかし、どのように呼び出すか、何か助けはありますか?これに関する以前の質問。参考までに

WriteBuffer 関数 i は次のように定義されています。

BOOL CWriter::Write(char* pMemName,char* pBinary,long lBuffSize)
{
long lUnitSize = MEM_UNIT_SIZE;
if( lBuffSize <= 0 && lUnitSize <=0 )
    return FALSE;
//Open named file mapping object.
HANDLE hFileMMF = OpenFileMapping(FILE_MAP_WRITE,FALSE,pMemName);

if(hFileMMF == NULL)
{
    DWORD dwErr = GetLastError();
    return (FALSE);
}

int nCount = 0;
nCount = (int)(lBuffSize / lUnitSize) + 1;
for(int n =0; n<nCount; ++n)
{
    DWORD dwFileOffsetHigh = 0;
    DWORD dwFileOffsetLow = lUnitSize*n;

    // Map  view of a file mapping into the address space of a calling process.
    LPVOID pViewMMFFile = MapViewOfFile(hFileMMF,
                        FILE_MAP_WRITE,
                        dwFileOffsetHigh,
                        dwFileOffsetLow,
                        MEM_UNIT_SIZE);
    if( pViewMMFFile == NULL )
        return (FALSE);
    CMutex mutex (FALSE, _T("MIPSMMMutexWriter"));
    CString strTemp;
    strTemp.Format("%s",pBinary);

    // Lock memory, shared amongst processes
    mutex.Lock();
    try
    {
        CopyMemory(pViewMMFFile,pBinary,lUnitSize); // write 
    }
    catch(CException e)
    {
        DWORD dw = ::GetLastError();
        TRACE1("%d",dw);
    }
    mutex.Unlock(); // Unlock shared memory
    //Unmap mapped view of a file from the calling process's address space.
    UnmapViewOfFile(pViewMMFFile);
}
return (TRUE);
}

Plsは、私がすべき修正があれば提案します。ありがとう。

4

1 に答える 1

1

次のリンクで説明されているように、

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366761(v=VS.85).aspx

「割り当ての粒度」を確認してください。このパラメーターを使用して、「dwFileOffsetLow」または「dwFileOffsetHigh」の値を設定する必要があると思います。

于 2011-11-10T10:13:10.627 に答える