【问题标题】:CreateFileMapping returns ERROR_INVALID_HANDLECreateFileMapping 返回 ERROR_INVALID_HANDLE
【发布时间】:2014-07-22 03:02:31
【问题描述】:

我第一次尝试使用 CreateFileMapping,当我使用 GetLastError() 时它给了我这个错误:

ERROR_INVALID_HANDLE: The handle is invalid.

这是我的代码:

    // create the name of our file-mapping object
    nTry++; // Ensures a unique string is used in case user closes and reopens
    wsprintfA(szName, FS6IPC_MSGNAME1 ":%X:%X", GetCurrentProcessId(), nTry);
    // stuff the name into a global atom
    m_atom = GlobalAddAtomA(szName);
    if (m_atom == 0)
   {    *pdwResult = ERR_ATOM;
        return FALSE;
    }

    // create the file-mapping object
    m_hMap = CreateFileMappingA(
                    (HANDLE)0xFFFFFFFF, // use system paging file
                    NULL,               // security
                    PAGE_READWRITE,     // protection
                    0, MAX_SIZE+256,       // size
                   szName);            // 

编辑:

第一个问题已解决,但现在我的程序在其他地方崩溃了。

#define FS6IPC_MESSAGE_SUCCESS 1
#define FS6IPC_MESSAGE_FAILURE 0

// IPC message types
#define FS6IPC_READSTATEDATA_ID    1
#define FS6IPC_WRITESTATEDATA_ID   2

// read request structure
typedef struct tagFS6IPC_READSTATEDATA_HDR
{
  DWORD dwId;       // FS6IPC_READSTATEDATA_ID
  DWORD dwOffset;   // state table offset
  DWORD nBytes;     // number of bytes of state data to read
  void* pDest;      // destination buffer for data (client use only)
} FS6IPC_READSTATEDATA_HDR;

// write request structure
typedef struct tagFS6IPC_WRITESTATEDATA_HDR
{
  DWORD dwId;       // FS6IPC_WRITESTATEDATA_ID
  DWORD dwOffset;   // state table offset
  DWORD nBytes;     // number of bytes of state data to write
} FS6IPC_WRITESTATEDATA_HDR;

while (*pdw)
{   switch (*pdw)
    {   case FS6IPC_READSTATEDATA_ID:
            pHdrR = (FS6IPC_READSTATEDATA_HDR *) pdw;
            m_pNext += sizeof(FS6IPC_READSTATEDATA_HDR);
            if (pHdrR->pDest && pHdrR->nBytes)
                CopyMemory(pHdrR->pDest, m_pNext, pHdrR->nBytes);
            m_pNext += pHdrR->nBytes; // Debugger says the issue is here
            break;

        case FS6IPC_WRITESTATEDATA_ID:
            // This is a write, so there's no returned data to store
            pHdrW = (FS6IPC_WRITESTATEDATA_HDR *) pdw;
            m_pNext += sizeof(FS6IPC_WRITESTATEDATA_HDR) + pHdrW->nBytes;
            break;

        default:
            // Error! So terminate the scan
            *pdw = 0;
            break;
    }

    pdw = (DWORD *) m_pNext;
}

【问题讨论】:

  • 要使用系统分页文件,第一个参数应该是INVALID_HANDLE_VALUE。
  • @HarryJohnston 我的应用程序崩溃了。
  • 在调用 CreateFileMapping 期间或之后会崩溃吗?你用的是什么编译器?您是在构建 32 位还是 64 位应用程序?
  • @HarryJohnston 它在这一行崩溃:m_pNext += pHdrR->nBytes;。我将完整代码放入主问题窗口。
  • 如果另一个进程(或线程)正在修改共享内存,而您的代码正在处理它,那么问题可能是您没有正确同步对内存的访问。如果不是,我不知道它是如何在该特定行上失败的,但问题似乎是由于内存缓冲区中的数据错误造成的,您需要在一行中单步执行有问题的循环有时间注意什么时候出错。

标签: c++ windows


【解决方案1】:

我猜你是在 64 位系统上运行的,而 HANDLE 是 64 位的。操作系统是完全正确的——句柄值0x00000000FFFFFFFF 是您的进程的无效句柄值。

你到底想做什么?如果要创建由实际文件支持的文件映射,请传入该文件的句柄。如果您想创建一个由分页文件支持的文件映射,请传入INVALID_HANDLE_VALUEINVALID_HANDLE_VALUE 恰好是 (HANDLE)-1,在 32 位系统上是 0xFFFFFFFF,但在 64 位系统上是 0xFFFFFFFFFFFFFFFF,但这并不重要,因为您应该只使用符号值 INVALID_HANDLE_VALUE 在任何案例。

如果您的应用程序在您传入INVALID_HANDLE_VALUE 时崩溃,这不是因为对CreateFileMapping 的调用失败,而是由于其他原因,您应该对其进行调试。

【讨论】:

  • 我从我的 Qt 调试器中得到这个:在线程 0 中停止:异常在 0x7feeaf1ab86,代码:0xc0000005:写访问冲突在:0x1,标志=0x
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 2020-12-01
  • 2013-01-22
  • 2011-02-07
  • 2020-09-13
相关资源
最近更新 更多