代码之家  ›  专栏  ›  技术社区  ›  johnny bravo

无法创建句柄,或句柄无效-WinAPI(CreateFile)[重复]

  •  -2
  • johnny bravo  · 技术社区  · 9 年前

    这是我的一段代码:

        #include <stdio.h>
        #include <windows.h>
        #include <iostream.h>
        #include <signal.h>
        #include <tchar.h>
        #include <stdarg.h>
    
        int main(int argc, char * agrv[]) {
    
            //Convert argument 2 to wide char pointer
            wchar_t w[MAX_PATH];
            size_t size_of_w = sizeof(w);
            mbstowcs_s(&size_of_w, w, argv[1], MAX_PATH);
            LPWSTR pFile = w;
    
            //Copy original file to temp file
            if (!CopyFile(w, L"temp.out", False))
            {
                printf("Error: could not copy file.");
                printf("CopyFile Errorcode %d\n", GetLastError());
                return 1;
            }
            pFile = L"temp.out";
    
            HANDLE hFile = CreateFile(pFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
            if (hFile == INVALID_HANDLE_VALUE)
            {
                printf("Error: could not create handle to file");
                printf("CreateFile Errorcode %d\n", GetLastError());
                return 1;
            }
            printf("Successfully created Handle");
            return 0;
        }
    

    我试图为新复制的文件“temp.out”打开一个句柄,但抛出了一个错误,它不起作用。

    我的调试打印(printf( "CreateFile Errorcode %d\n", GetLastError()); ) 打印“CreateFile Errorcode:2”(未找到文件),但找到了,因为CopyFile工作正常。

    编辑: 我已经使用了绝对路径,现在,当我试图使用句柄将文件映射到内存时,它抛出“6”,这意味着句柄无效:

        HANDLE pMap = CreateFileMapping(hFile, NULL, PAGE_EXECUTE_READWRITE,0 ,0 ,NULL);
            LPVOID lpBase MapViewOfFile(pMap, FILE_MAP_ACCESS| FILE_MAP_EXECUTE, 0, 0, 0);
            printf("CreateFileMapping Errorcode %d\n", GetLastError());
            if (!lpBase)
            {
                printf("Error: could not map file to memory");
                printf("CreateFileMapping Errorcode %d\n", GetLastError());
                return 1;
            }
            printf("Successfully mapped file");
    

    编辑2:

    我在CopyFile中添加了错误处理,但它工作正常,确实复制了文件。 输出现在是:

    程序exe shit.txt文件 已成功创建句柄 错误:无法将文件映射到内存 createMapFile错误代码:6

    1 回复  |  直到 9 年前
        1
  •  0
  •   Barmak Shemirani    9 年前

    没有 <iostream.h> ,请考虑使用新的编译器!

    您可以使用 wmain 以避免字符串转换。虽然您并不真正需要,也不需要创建文件。使用 INVALID_HANDLE_VALUE 而不是 hFile

    #include <iostream>
    #include "windows.h"
    
    int wmain(int argc, wchar_t* argv[])
    {
        const int buflen = 1000;
        wchar_t* mapName = L"MyMapName";
        wchar_t* message = L"123\0";
    
        HANDLE hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, buflen, mapName);
        if (!hFileMapping)
        {
            printf("CreateFileMapping error %d\n", GetLastError());
            return 1;
        }
    
        LPVOID buf = MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, buflen);
        if (!buf)
        {
            printf("MapViewOfFile error %d\n", GetLastError());
            CloseHandle(hFileMapping);
            return 1;
        }
        CopyMemory(buf, message, (wcslen(message) * sizeof(wchar_t)));
        system("pause");//wait until another program reads this data
        UnmapViewOfFile(buf);
        CloseHandle(hFileMapping);
        return 0;
    }
    

    如果使用真实的文件句柄而不是 无效的句柄值 则改用该方法(注意, buflen 为零): CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, mapName);

    在另一个程序中:

    int wmain()
    {
        const int buflen = 1000;
        wchar_t* mapName = L"MyMapName";
        HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, mapName);
        if (!hMapFile)
        {
            DWORD e = GetLastError();
            printf("OpenFileMapping %d\n", e);//EDITED: this line was missing
            return 1;
        }
    
        wchar_t* buf = (wchar_t*)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, buflen);
        if (!pBuf)
        {
            DWORD e = GetLastError();    
            printf("MapViewOfFileerror %d\n", e);//EDITED: this line was missing
            CloseHandle(hMapFile);
            return 1;
        }
        wcout << buf << endl;
        UnmapViewOfFile(buf);
        CloseHandle(hMapFile);
        return 0;
    }