Как повторить вызов MapViewOfFile с другим диапазоном для файла, чтобы написать больший буфер. - PullRequest
0 голосов
/ 10 ноября 2011

Я использую функции совместно используемой памяти для записи данных в файл.Проблема: Когда я хочу записать буфер размером 10 МБ в файл, используя функцию ниже, я могу записать только в первой итерации, во второй итерации я не смог записать следующую часть буфера в память.Пожалуйста, помогите мне, если есть предложение.или любой неправильный в приведенном ниже коде.У меня есть только контроль над этой частью.У меня нет контроля в другой части, которая имеет CreateFileMapping.

любую вещь, которую мне нужно изменить в "dwFileOffsetLow" или "dwFileOffsetHigh".со второй итерации и далее «MapViewOfFile» возвращает ноль.В каком-то месте я получил данные, так как мне нужно повторить вызов MapViewOfFile для разных диапазонов.Но как позвонить, любая помощь? ранее заданный вопрос по этому вопросу.Для справки !

Функция WriteBuffer я определил следующим образом:

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);
}

Пожалуйста, предложите, если я должен сделать какую-либо коррекцию.спасибо.

1 Ответ

1 голос
/ 10 ноября 2011

, как описано в следующей ссылке,

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

Можете ли вы проверить «гранулярность распределения», я думаю, вам следует использовать этот параметр, чтобы установить значения для «dwFileOffsetLow» или «dwFileOffsetHigh».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...