首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CreateFileMapping返回ERROR_INVALID_HANDLE

CreateFileMapping返回ERROR_INVALID_HANDLE
EN

Stack Overflow用户
提问于 2014-07-22 03:02:31
回答 1查看 2.1K关注 0票数 1

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

代码语言:javascript
复制
ERROR_INVALID_HANDLE: The handle is invalid.

这是我的代码:

代码语言:javascript
复制
    // 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);            // 

编辑:

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

代码语言:javascript
复制
#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;

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2014-07-22 03:17:02

我猜你是在64位系统上运行的,它的句柄是64位。操作系统非常正确--句柄值0x00000000FFFFFFFF是进程的无效句柄值。

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24878201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档