MapViewOfFile
ポインタを返します。NULL
エラーが発生した場合は、(-1)ではなくINVALID_HANDLE_VALUE
(0)を返します。
編集:あなたのコードには他にもたくさんの問題がありました:
QString::constData()
を返しますがQChar*
、代わりwchar_t*
に使用する必要があります。QString::utf16()
- 失敗した場合は、ではなく、
CreateFileMappingW
を返します。NULL
INVALID_HANDLE_VALUE
MapViewOfFile
アクセスパラメータはFILE_MAP_READ
、ではなくGENERIC_READ
です。
uint
多くの場合、は2バイトよりも大きいため、2バイトmemmove
しか読み取らない場合は、前に変数を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()
またはから返されたエラーコードから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();
}
}