如何用CreateFileMapping在N个进程间共享一个HWND类型内存? 我想在N个进程间共享一个窗口句柄,如何做呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 建立 ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); HANDLE hShare = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(HWND), TEXT("SHARE")); if(hShare) { LPVOID lp = MapViewOfFile(hShare, FILE_MAP_ALL_ACCESS, 0, 0, 0); if(lp) { lp = (HWND) hWnd; FlushViewOfFile(lp, sizeof(hWnd)); } else { MessageBox(hWnd, TEXT("lp!"), TEXT("lp"), MB_OK); } } else { MessageBox(hWnd, TEXT("Error!"), TEXT("Error"), MB_OK); }读取 HANDLE hShare = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, TEXT("SHARE")); if(hShare) { HWND lp = (HWND)MapViewOfFile(hShare, FILE_MAP_ALL_ACCESS, 0, 0, 0); ShowWindow((HWND)lp, SW_HIDE); } else { MessageBox(hWnd, TEXT("Error!"), TEXT("Error"), MB_OK); } 你用这个类试试class CIPC{public: CIPC(); virtual ~CIPC(); bool CreateIPCMMF(void); bool OpenIPCMMF(void); void CloseIPCMMF(void); bool IsOpen(void) const {return (m_hFileMap != NULL);} bool ReadIPCMMF(LPBYTE pBuf, DWORD &dwBufSize); bool WriteIPCMMF(const LPBYTE pBuf, const DWORD dwBufSize); bool Lock(void); void Unlock(void);protected: HANDLE m_hFileMap; HANDLE m_hMutex;};#include <windows.h>#include <tchar.h>#include <crtdbg.h>#include "IPC.h"const static LPCTSTR g_szIPCSharedMMF = _T("{34F673E0-878F-11D5-B98A-00B0D07B8C7C}");const static LPCTSTR g_szIPCMutex = _T("{34F673E1-878F-11D5-B98A-00B0D07B8C7C}");//***********************************************CIPC::CIPC() : m_hFileMap(NULL), m_hMutex(NULL){}//***********************************************CIPC::~CIPC(){ CloseIPCMMF(); Unlock();}//***********************************************bool CIPC::CreateIPCMMF(void){ bool bCreated = false; try { if(m_hFileMap != NULL) return false; // Already created // Create an in-memory 4KB memory mapped file to share data m_hFileMap = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 4096, g_szIPCSharedMMF); if(m_hFileMap != NULL) bCreated = true; } catch(...) {} return bCreated;}//***********************************************bool CIPC::OpenIPCMMF(void){ bool bOpened = false; try { if(m_hFileMap != NULL) return true; // Already opened m_hFileMap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, g_szIPCSharedMMF); if(m_hFileMap != NULL) bOpened = true; } catch(...) {} return bOpened;}//***********************************************void CIPC::CloseIPCMMF(void){ try { if(m_hFileMap != NULL) CloseHandle(m_hFileMap), m_hFileMap = NULL; } catch(...) {}}//***********************************************bool CIPC::ReadIPCMMF(LPBYTE pBuf, DWORD &dwBufSize){ _ASSERTE(pBuf); bool bSuccess = true; try { if(m_hFileMap == NULL) return false; DWORD dwBaseMMF = (DWORD)MapViewOfFile(m_hFileMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); _ASSERTE(dwBaseMMF); // The first DWORD in the MMF contains the size of the data DWORD dwSizeofInBuf = dwBufSize; CopyMemory(&dwBufSize, (LPVOID)dwBaseMMF, sizeof(DWORD)); if(dwSizeofInBuf != 0) { if(dwBufSize > dwSizeofInBuf) bSuccess = false; else CopyMemory(pBuf, (LPVOID)(dwBaseMMF + sizeof(DWORD)), dwBufSize); } UnmapViewOfFile((LPVOID)dwBaseMMF); } catch(...) {} return bSuccess;}//***********************************************bool CIPC::WriteIPCMMF(const LPBYTE pBuf, const DWORD dwBufSize){ _ASSERTE(pBuf); bool bSuccess = true; try { if(m_hFileMap == NULL) return false; DWORD dwBaseMMF = (DWORD)MapViewOfFile(m_hFileMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); _ASSERTE(dwBaseMMF); // The first DWORD in the MMF contains the size of the data CopyMemory((LPVOID)dwBaseMMF, &dwBufSize, sizeof(DWORD)); CopyMemory((LPVOID)(dwBaseMMF + sizeof(DWORD)), pBuf, dwBufSize); UnmapViewOfFile((LPVOID)dwBaseMMF); } catch(...) {} return bSuccess;}//***********************************************bool CIPC::Lock(void){ bool bLocked = false; try { // First get the handle to the mutex m_hMutex = CreateMutex(NULL, FALSE, g_szIPCMutex); if(m_hMutex != NULL) { // Wait to get the lock on the mutex if(WaitForSingleObject(m_hMutex, INFINITE) == WAIT_OBJECT_0) bLocked = true; } } catch(...) {} return bLocked;}//***********************************************void CIPC::Unlock(void){ try { if(m_hMutex != NULL) { ReleaseMutex(m_hMutex); CloseHandle(m_hMutex); m_hMutex = NULL; } } catch(...) {}} 看看每一步的返回值,比如hShare,看是否成功了 SetROP2设置CPen没效果 VC多线程socket的问题. 在单对话框下创建CView 为什么不行 datagrid的疑问 控件继承的问题 VC+ACCESS数据库程序的问题。 关于注册表的小问题 如何控制对话框大小改变时发送的消息 DLL调用windows内存映射问题 我在工具条上加了个CButton,为什么上面的字总是灰的 word文档转换PDF时遇到的问题 关于vc++ 6.0 几个简单问题,来抢分吧
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); HANDLE hShare = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(HWND), TEXT("SHARE")); if(hShare)
{
LPVOID lp = MapViewOfFile(hShare, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if(lp)
{
lp = (HWND) hWnd;
FlushViewOfFile(lp, sizeof(hWnd));
}
else
{
MessageBox(hWnd, TEXT("lp!"), TEXT("lp"), MB_OK);
}
}
else
{
MessageBox(hWnd, TEXT("Error!"), TEXT("Error"), MB_OK);
}
读取
HANDLE hShare = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, TEXT("SHARE")); if(hShare)
{
HWND lp = (HWND)MapViewOfFile(hShare, FILE_MAP_ALL_ACCESS, 0, 0, 0);
ShowWindow((HWND)lp, SW_HIDE);
}
else
{
MessageBox(hWnd, TEXT("Error!"), TEXT("Error"), MB_OK);
}
{
public:
CIPC();
virtual ~CIPC();
bool CreateIPCMMF(void);
bool OpenIPCMMF(void);
void CloseIPCMMF(void);
bool IsOpen(void) const {return (m_hFileMap != NULL);}
bool ReadIPCMMF(LPBYTE pBuf, DWORD &dwBufSize);
bool WriteIPCMMF(const LPBYTE pBuf, const DWORD dwBufSize);
bool Lock(void);
void Unlock(void);
protected:
HANDLE m_hFileMap;
HANDLE m_hMutex;
};#include <windows.h>
#include <tchar.h>
#include <crtdbg.h>
#include "IPC.h"const static LPCTSTR g_szIPCSharedMMF = _T("{34F673E0-878F-11D5-B98A-00B0D07B8C7C}");
const static LPCTSTR g_szIPCMutex = _T("{34F673E1-878F-11D5-B98A-00B0D07B8C7C}");//***********************************************
CIPC::CIPC() : m_hFileMap(NULL), m_hMutex(NULL)
{
}//***********************************************
CIPC::~CIPC()
{
CloseIPCMMF();
Unlock();
}//***********************************************
bool CIPC::CreateIPCMMF(void)
{
bool bCreated = false; try
{
if(m_hFileMap != NULL)
return false; // Already created // Create an in-memory 4KB memory mapped file to share data
m_hFileMap = CreateFileMapping((HANDLE)0xFFFFFFFF,
NULL,
PAGE_READWRITE,
0,
4096,
g_szIPCSharedMMF);
if(m_hFileMap != NULL)
bCreated = true;
}
catch(...) {} return bCreated;
}//***********************************************
bool CIPC::OpenIPCMMF(void)
{
bool bOpened = false; try
{
if(m_hFileMap != NULL)
return true; // Already opened m_hFileMap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,
FALSE,
g_szIPCSharedMMF);
if(m_hFileMap != NULL)
bOpened = true;
}
catch(...) {} return bOpened;
}//***********************************************
void CIPC::CloseIPCMMF(void)
{
try
{
if(m_hFileMap != NULL)
CloseHandle(m_hFileMap), m_hFileMap = NULL;
}
catch(...) {}
}//***********************************************
bool CIPC::ReadIPCMMF(LPBYTE pBuf, DWORD &dwBufSize)
{
_ASSERTE(pBuf); bool bSuccess = true; try
{
if(m_hFileMap == NULL)
return false; DWORD dwBaseMMF = (DWORD)MapViewOfFile(m_hFileMap,
FILE_MAP_READ | FILE_MAP_WRITE,
0, 0, 0);
_ASSERTE(dwBaseMMF); // The first DWORD in the MMF contains the size of the data
DWORD dwSizeofInBuf = dwBufSize;
CopyMemory(&dwBufSize, (LPVOID)dwBaseMMF, sizeof(DWORD)); if(dwSizeofInBuf != 0)
{
if(dwBufSize > dwSizeofInBuf)
bSuccess = false;
else
CopyMemory(pBuf, (LPVOID)(dwBaseMMF + sizeof(DWORD)), dwBufSize);
} UnmapViewOfFile((LPVOID)dwBaseMMF);
}
catch(...) {} return bSuccess;
}//***********************************************
bool CIPC::WriteIPCMMF(const LPBYTE pBuf, const DWORD dwBufSize)
{
_ASSERTE(pBuf); bool bSuccess = true; try
{
if(m_hFileMap == NULL)
return false; DWORD dwBaseMMF = (DWORD)MapViewOfFile(m_hFileMap,
FILE_MAP_READ | FILE_MAP_WRITE,
0, 0, 0);
_ASSERTE(dwBaseMMF); // The first DWORD in the MMF contains the size of the data
CopyMemory((LPVOID)dwBaseMMF, &dwBufSize, sizeof(DWORD));
CopyMemory((LPVOID)(dwBaseMMF + sizeof(DWORD)), pBuf, dwBufSize); UnmapViewOfFile((LPVOID)dwBaseMMF);
}
catch(...) {} return bSuccess;
}//***********************************************
bool CIPC::Lock(void)
{
bool bLocked = false; try
{
// First get the handle to the mutex
m_hMutex = CreateMutex(NULL, FALSE, g_szIPCMutex);
if(m_hMutex != NULL)
{
// Wait to get the lock on the mutex
if(WaitForSingleObject(m_hMutex, INFINITE) == WAIT_OBJECT_0)
bLocked = true;
}
}
catch(...) {} return bLocked;
}//***********************************************
void CIPC::Unlock(void)
{
try
{
if(m_hMutex != NULL)
{
ReleaseMutex(m_hMutex);
CloseHandle(m_hMutex);
m_hMutex = NULL;
}
}
catch(...) {}
}