0

次のような関数 CreateFile を使用してファイルを読み取りたいだけです。

#include <iostream>
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv)
{
    PIMAGE_DOS_HEADER pImageDosHeader;
    HANDLE hFile = NULL;
    HANDLE hMapObject;
    PUCHAR uFileMap;
    if (argc < 2)
        return (-1);
    std::cout << "hFile=" << hFile << std::endl;
    if (!(hFile = CreateFile((LPCWSTR)argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,
        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)))
    {
        return (-1);
    } else {
        std::cout << argv[1] << std::endl;
        std::cout << "hFile=" << hFile << std::endl;
        getchar();
    }
    return (0);
}

問題は、出力が次のようになることです。

hFile=000000 (ポインタをNULLに初期化→OK)

hFile=FFFFFF (無効なポインター)

誰でも私を助けることができますか?よろしくお願いします。

4

2 に答える 2

2

以下:

if (!(hFile = CreateFile(...)))

エラーをチェックする方法ではありません。

ドキュメントから:

関数が失敗した場合、戻り値はINVALID_HANDLE_VALUEです。拡張エラー情報を取得するには、を呼び出しますGetLastError

INVALID_HANDLE_VALUE-1、または0xFFFFFFFFF16進数です。GetLastError()何が起こったのかを知るために電話する必要があります。

于 2013-03-07T14:11:48.420 に答える
0

ほとんどのWin32APIからエラーが発生した場合は、GetLastError()何が問題だったかを調べるために呼び出すことができます。そこからそれを取りなさい。

このタイプの防御プログラミングは、生産的なWin32プログラミングに不可欠です。障害の実際の条件はAPIによって異なるため、MSDNを使用して、障害コードパスで何を探す必要があるかを確認してください。

于 2013-03-07T14:11:40.383 に答える