MapViewOfFile
返回一个指针,或者NULL
当有错误时返回 (0),而不是INVALID_HANDLE_VALUE
(-1)。
编辑:您的代码还有很多其他问题:
QString::constData()
return QChar*
, not wchar_t*
,你必须使用QString::utf16()
。
- 如果
CreateFileMappingW
失败则返回NULL
,不返回INVALID_HANDLE_VALUE
。
MapViewOfFile
访问参数是FILE_MAP_READ
,不是GENERIC_READ
。
uint
通常大于 2 个字节,因此memmove
如果您只读取 2 个字节,则应在之前将变量初始化为 0。
这是应该工作的最小代码(仅在 wineg++/wine 上测试):
#include <windows.h>
#include <QtCore/QString>
#include <QtCore/QDebug>
#include <QtCore/QTextStream>
int main(int argc, char const *argv[])
{
if (argc < 2) {
QTextStream(stdout) << "Usage :" << argv[0] << " filename" << endl;
return 1;
}
QString objPath(argv[1]);
// Qt source uses C-Style cast from utf16() to (wchar_t*),
// so it should be safe
HANDLE hFile = CreateFileW((const wchar_t *) objPath.utf16(), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
qDebug() << qt_error_string();
} else {
HANDLE hMapFile = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (!hMapFile) {
qDebug() << qt_error_string();
} else {
void *pMapView = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
if (!pMapView) {
qDebug() << qt_error_string();
} else {
uint DefineWord = 0;
memmove((void *) &DefineWord, pMapView, 2);
qDebug() << DefineWord;
}
CloseHandle(hMapFile);
}
CloseHandle(hFile);
}
return 0;
}
PS:QString qt_error_string(int errorCode = -1)
是一个明显未记录的 Qt 函数,它返回最后一个错误的错误字符串(来自从GetLastError()
or返回的错误代码errno
)。
如果您使用的是 Qt,则可以使用QFile::map()将文件映射到内存。
要执行您的初始代码应该执行的操作,您只需在找到的代码示例中添加 2 行(加上错误检查):
QFile file("foo");
if(!file.open(QFile::ReadOnly)) {
qDebug() << file.errorString();
} else {
uchar *memory = file.map(0, file.size());
if (!memory) {
qDebug() << file.errorString();
} else {
uint DefineWord = 0;
memmove(&DefineWord, memory, 2);
file.unmap();
}
}