⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qmemoryfile_win.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.** ** This program is free software; you can redistribute it and/or modify it** under the terms of the GNU General Public License as published by the** Free Software Foundation; either version 2 of the License, or (at your** option) any later version.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** This program is distributed in the hope that it will be useful, but** WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "qmemoryfile_p.h"#include <windows.h>#include <winbase.h> #include <qdir.h>#include <qfile.h>#include <stdio.h>class QMemoryFileData{ public:     QMemoryFileData(HANDLE hFile, HANDLE hMapeFile, LPVOID pMapFile);     ~QMemoryFileData();    operator char*() { return (char*) pMapFile;}private:    HANDLE hFile, hMapFile;     LPVOID pMapFile;};/*!  Contructs the memory map data  */QMemoryFileData::QMemoryFileData(HANDLE hFile, HANDLE hMapFile, LPVOID pMapFile) {    this->hFile = hFile;    this->hMapFile = hMapFile;    this->pMapFile = pMapFile;} /*!  Destructs the memory map data */QMemoryFileData::~QMemoryFileData(){    if (pMapFile != NULL){	UnmapViewOfFile(pMapFile);	CloseHandle(hMapFile);	CloseHandle(hFile);	        }	    }/* As this function is in both _unix and _win, its documentation is in qmemoryfile.cpp */QMemoryFileData * QMemoryFile::openData (const QString &fileName, int flags, 					 uint size ){    HANDLE hFile =(HANDLE)INVALID_HANDLE_VALUE, hMapFile = NULL;    DWORD dwCreationDisposition = OPEN_EXISTING;    LPVOID pMapFile = NULL;    DWORD fileSize;    QMemoryFileData *data = NULL;    DWORD dwDesiredAccess;    DWORD dwShareMode;        DWORD dwDesiredMapAccess;    DWORD dwPageAccess;    QString memoryName = QString();    // Do we have a named memory map    if (fileName.left(2) == "\\\\"){	flags |= QMemoryFile::Shared;	memoryName = fileName.mid(2);    }    fileSize = size;        if (flags & QMemoryFile::Write){        dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;	dwShareMode = FILE_SHARE_WRITE | FILE_SHARE_READ;	dwDesiredMapAccess = FILE_MAP_WRITE;	if ((flags & QMemoryFile::Shared) != 0)	    dwPageAccess = PAGE_READWRITE;	else{	    dwPageAccess = PAGE_WRITECOPY;	    dwDesiredMapAccess = FILE_MAP_COPY;	}    }else{	dwDesiredAccess = GENERIC_READ;	dwShareMode = FILE_SHARE_READ;	dwDesiredMapAccess = FILE_MAP_READ;	dwPageAccess = PAGE_READONLY;    }    if (!memoryName.isNull()){	if (size == 0){	    qWarning("Requested operation on named memory map without " \		     "supplying a size of memory to map ");	    return data;      }      if (flags & QMemoryFile::Create){	  if (hMapFile == NULL){	      QT_WA ( {		      hMapFile = CreateFileMappingW(hFile, 			  NULL,			  dwPageAccess,			  0,			  fileSize,			  (const TCHAR*)qt_winTchar(memoryName,TRUE));		      }, {		      hMapFile = CreateFileMappingA(hFile, 			  NULL,			  dwPageAccess,			  0,			  fileSize,			  memoryName.local8Bit());		      });	  }      }else{	  QT_WA( {	    		  hMapFile = OpenFileMappingW(dwDesiredAccess, TRUE,		      (const TCHAR*)qt_winTchar(memoryName,TRUE));			  }, {		  hMapFile = OpenFileMappingA(dwDesiredAccess, TRUE,		      memoryName.local8Bit());			  });      }    }else{	const QString convertedName = QDir::convertSeparators(fileName);	bool fillFile = FALSE;	if  (flags & QMemoryFile::Create){	    if (size == 0){		qWarning("Requested to create memory file without "			 "supplying a size of memory to map ");		return data;	    }	    QDir d;	    if (!d.exists(convertedName)){		dwCreationDisposition = CREATE_NEW;		// fill file with zeros		fillFile = TRUE;	    }else		dwCreationDisposition = OPEN_EXISTING;	}else {	    dwCreationDisposition = OPEN_EXISTING;	    QT_WA ( {		    hFile = CreateFileW( (const TCHAR*) qt_winTchar(convertedName,TRUE),			dwDesiredAccess,			dwShareMode,			NULL,			dwCreationDisposition,			FILE_ATTRIBUTE_NORMAL,			NULL);    		    }, {		    hFile = CreateFileA(convertedName.local8Bit(),			dwDesiredAccess,			dwShareMode,			NULL,			dwCreationDisposition,			FILE_ATTRIBUTE_NORMAL,			NULL);    		    });	    }	if (hFile != (HANDLE)INVALID_HANDLE_VALUE){	    if (fillFile){		if ((SetFilePointer(hFile, size, NULL, FILE_BEGIN) !=   0xFFFFFFFF) &&		        WriteFile(hFile, "",  1L, NULL, NULL))  		    fileSize = size;		else		    fileSize = 0xFFFFFFFF;	    }else		fileSize = GetFileSize(hFile, NULL);	    if (fileSize != 0xFFFFFFFF){		QT_WA( {			hMapFile = CreateFileMapping(hFile, 			    NULL,			    dwPageAccess,			    0,			    fileSize,			    NULL);			}, {			hMapFile = CreateFileMappingA(hFile, 			    NULL,			    dwPageAccess,			    0,			    fileSize,			    NULL);			});	    }	}else{	    if (memoryName.isNull())		qDebug("QMemory File unable to open real file %s",convertedName.latin1());	    else		qDebug("QMemory File unable to open memory block named %s",memoryName.latin1());	}    }    if (hMapFile != NULL){	pMapFile = MapViewOfFile(hMapFile, dwDesiredMapAccess, 0, 0, 0);	if (pMapFile == NULL){	    qDebug(" Memory map failed (Map of view : error number %d )", 		    GetLastError());	    CloseHandle(hMapFile);	    hMapFile = NULL;		    CloseHandle(hFile);	    hFile = NULL;	}else{	    data = new QMemoryFileData(hFile, hMapFile, pMapFile); 	    this->flags = flags;	    this->length = fileSize;	}    }else{	qDebug(" Memory map failed (Create/Open file : error number %d",		   GetLastError());    }    if (data == NULL)	qDebug("Failed to mmap %s", fileName.latin1());    else	block = *data;    return data;}/*  \internal As this function is in both _unix and _win, its documentation is in qmemoryfile.cpp */void QMemoryFile::closeData(QMemoryFileData *memoryFile){    delete memoryFile;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -