MapViewOfFile
は、INVALID_HANDLE_VALUE
(-1)ではなく、エラーがある場合はNULL
(0)を返します。
編集:あなたのコードと他の多くの問題がありました:
QString::constData()
戻りQChar*
、ないwchar_t*
は、あなたの代わりにQString::utf16()
を使用する必要があります。
CreateFileMappingW
に失敗した場合は、INVALID_HANDLE_VALUE
ではなくNULL
が返されます。
MapViewOfFile
アクセスパラメータはFILE_MAP_READ
で、GENERIC_READ
ではありません。
uint
は2バイトよりも大きいことが多いので、2バイトのみを読み取る場合は、memmove
より前に変数を0に初期化する必要があります。ここで
(のみwineg ++ /ワインでテスト)動作するはず最小限のコードです:
#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();
}
}
あなたが何についてより明確にした場合、それが参考になりますあなたは尋ねている。ソースコードに「いつものエラーがあります」というコメントがあります。エラーの内容を正確に教えてください(エラーメッセージはありますか?)。ソースコードだけでなく、質問にその情報を入力してください。ありがとう。 –
特に、コードをコンパイルするときや実行するときにエラーが発生していますか? –
私がデバッグしているときに、メッセージ "segmentation fault" SIGSEGVがあります。 – user1276647