【发布时间】: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;。我将完整代码放入主问题窗口。 -
如果另一个进程(或线程)正在修改共享内存,而您的代码正在处理它,那么问题可能是您没有正确同步对内存的访问。如果不是,我不知道它是如何在该特定行上失败的,但问题似乎是由于内存缓冲区中的数据错误造成的,您需要在一行中单步执行有问题的循环有时间注意什么时候出错。