我想在N个进程间共享一个窗口句柄,如何做呢?
解决方案 »
- 问一个很低级的问题,可是我真不会
- 有关Check Box
- 请mwy654321进来
- 关于VC多线程实现服务器加多个客户端的套接字问题
- 给datoucaicai的另外的分,刚才的分不够,先给50现在再加20
- 怎样在打开文件对话框下面加一个文本显示区
- 用atl写的BHO,无法获得浏览器的父窗口句柄,急!!!
- 怎样用Graphics:: SetInterpolationMode调整缩略图的质量。
- MFC中SetWindowExt(),SetViewportExt()有什么用处?
- 如何识别用户是Remote Control的用户
- 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(...) {}
}