gpt4 book ai didi

c++ - CreateFileMapping 返回 ERROR_INVALID_HANDLE

转载 作者:可可西里 更新时间:2023-11-01 11:18:33 29 4
gpt4 key购买 nike

我是第一次尝试使用 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;
}

最佳答案

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

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

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

关于c++ - CreateFileMapping 返回 ERROR_INVALID_HANDLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24878201/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com