我想在N个进程间共享一个窗口句柄,如何做呢?

解决方案 »

  1.   

    建立
      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);
    }
      

  2.   

    你用这个类试试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(...) {}
    }
      

  3.   

    看看每一步的返回值,比如hShare,看是否成功了