内存映射文件操作相关

// ATS4DemoDlg.h : header file
//

#if !defined(AFX_ATS4DEMODLG_H__32E6642D_5F67_4613_B312_9C160914A930__INCLUDED_)
#define AFX_ATS4DEMODLG_H__32E6642D_5F67_4613_B312_9C160914A930__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "stdafx.h"
//#include "log4nb.h"


class Deliver
{
public:
    Deliver(const TCHAR * imageFilename,log4nb * logger);

    BOOL openMapfile();
    CString getFilename();
    BOOL receiveFile(LPCTSTR tempFilename);
    BOOL resultWriteBack(LPCTSTR resultXml);
private:
    log4nb * De_logger;
protected:
    TCHAR    mtcImageFilename[250];
    HANDLE    mhFile;
    INT64    lpMapAddress;
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_ATS4DEMODLG_H__32E6642D_5F67_4613_B312_9C160914A930__INCLUDED_)

 

 

 

 

#include "StdAfx.h"
#include "Deliver.h"
//#include "Log.h"

Deliver::Deliver(const TCHAR *imageFilename,log4nb * logger)
{

    strcpy_s(mtcImageFilename,sizeof(mtcImageFilename),imageFilename);
    De_logger = logger;
}

CString Deliver::getFilename()
{
    De_logger->tmWrite("getFilename() begin");
    CString temp;
    temp = mtcImageFilename;//.Format("%s",mtcImageFilename);
    De_logger->tmWrite("getFilename() end");
    return temp;
}

BOOL Deliver::openMapfile()
{
    De_logger->tmWrite("openMapfile() begin");
    if( NULL == mtcImageFilename )
    {
        TRACE(_T("have no File map object./n"));
        De_logger->tmWrite("have no File map object");
        De_logger->tmException("openMapfile()    Get ImageFilename    Failed");
        return FALSE;
    }
    mhFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,//read/write permission.
                            FALSE,//do not inherit name of object
                            mtcImageFilename);

    if( NULL == mhFile )   
    {
        TRACE(_T("OpenFileMapping failed./n"));
        De_logger->tmException("openMapfile()    Open file mapping    Failed");
        return FALSE;
    }

    lpMapAddress = (INT64)MapViewOfFile(mhFile,FILE_MAP_ALL_ACCESS,0,0,0);
   
    if( NULL == lpMapAddress )
    {
        TRACE(_T("MapViewOfFile failed./n"));
        De_logger->tmException("openMapfile()    Get view of filemapping        Failed");
        return FALSE;
    }

    De_logger->tmWrite("openMapfile() end");
    return TRUE;

}

BOOL Deliver::receiveFile(LPCTSTR tempFilename)
{
    De_logger->tmWrite("receiveFile() begin");
   
    if( NULL == lpMapAddress)
    {
        TRACE(_T("Image file address is null."));
        De_logger->tmException("receiveFile()    Get MapAddress        Failed");
        return FALSE;
    }

    LPVOID lpBuffer = new BYTE[2048];
    DWORD    nNumberOfBytesToWrite = 0;
    //LPDWORD    lpNumberOfBytesWritten;
    //nNumberOfBytesToWrite = *((LPDWORD) lpMapAddress);
    memcpy(lpBuffer,(LPVOID)lpMapAddress,sizeof(int));//get the header,how long the file should be to read.
    nNumberOfBytesToWrite = *((LPDWORD) lpMapAddress);
    //memcpy(&nNumberOfBytesToWrite,lpBuffer,sizeof(int));
    TRACE(_T("%ld"),nNumberOfBytesToWrite);

    memcpy(lpBuffer,(LPVOID)(lpMapAddress + sizeof(int)),nNumberOfBytesToWrite);

    HANDLE hFileTemp = CreateFile(tempFilename,GENERIC_ALL,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hFileTemp == INVALID_HANDLE_VALUE)
    {
        TRACE(_T("Create temp file failed./n"));
        De_logger->tmWrite("Create temp file failed.");
        De_logger->tmException("receiveFile()    Create temp file    Failed");
        return FALSE;
    }
    CFile writeFile(hFileTemp);
    writeFile.Write(lpBuffer,nNumberOfBytesToWrite);

    CloseHandle(hFileTemp);
    delete lpBuffer;

    De_logger->tmWrite("receiveFile() end");
    return TRUE;

}

BOOL Deliver::resultWriteBack(LPCTSTR resultXml)
{
    De_logger->tmWrite("resultWriteBack() begin");
    if( _tcslen(resultXml) < 1 )
    {
        TRACE(_T("Result is empty./n"));
        De_logger->tmException("resultWriteBack()    Get result xml        Failed");
        return FALSE;
    }

    int lenAddr = _tcslen(resultXml);
    memcpy( (LPVOID)lpMapAddress,(LPVOID)(&lenAddr),sizeof(int) );
    memcpy( (LPVOID)(lpMapAddress + sizeof(int)),(LPVOID)resultXml,lenAddr );

    UnmapViewOfFile((LPVOID)lpMapAddress);
    if( NULL != mhFile)
        CloseHandle(mhFile);

    De_logger->tmWrite("resultWriteBack() end");
    return TRUE;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值