2010年1月22日 星期五

CuMsgQueue - pass information between different programs.

// pass information between different programs.

//

MSGQUEUEOPTIONS msg_queue_options;

msg_queue_options.dwSize    = sizeof(MSGQUEUEOPTIONS);
msg_queue_options.dwMaxMessages    = 0;
msg_queue_options.cbMaxMessage    = TEST_BUFFER_SIZE;
msg_queue_options.bReadAccess    = TRUE;
msg_queue_options.dwFlags    = MSGQUEUE_NOPRECOMMIT;

MsgReadQueue.CreateMsgQueue(lpszName, &msg_queue_options);

//

wchar_t test_text[TEST_BUFFER_SIZE];
ret = WaitForSingleObject(MsgReadQueue, INFINITE);
 

if (ret == WAIT_OBJECT_0) {
        DWORD    read_bytes;
        DWORD    flag;

        MsgReadQueue.ReadMsgQueue(test_text, sizeof(wchar_t) * TEST_BUFFER_SIZE, &read_bytes, INFINITE, &flag);
}


// CuMsgQueue.h


class CuMsgQueue  
{
    HANDLE m_hCreateMsgQueue;

public:
    BOOL ReadMsgQueue(LPVOID lpBuffer,
                        DWORD cbBufferSize,
                        LPDWORD lpNumberOfBytesRead,
                        DWORD dwTimeout,
                        DWORD* pdwFlags);
    HANDLE CreateMsgQueue(LPWSTR lpszName,LPMSGQUEUEOPTIONS lpOptions);
    BOOL CloseMsgQueue(  );
    operator HANDLE() const;


    CuMsgQueue();
    virtual ~CuMsgQueue();

};


// CuMsgQueue.cpp


CuMsgQueue::CuMsgQueue()
:m_hCreateMsgQueue(NULL)
{

}

CuMsgQueue::~CuMsgQueue()
{
    CloseMsgQueue();
}

BOOL CuMsgQueue::CloseMsgQueue()
{
    return ::CloseMsgQueue(m_hCreateMsgQueue);
}

HANDLE CuMsgQueue::CreateMsgQueue(LPWSTR lpszName, LPMSGQUEUEOPTIONS lpOptions)
{

    CloseMsgQueue();
    m_hCreateMsgQueue = ::CreateMsgQueue(lpszName, lpOptions);
    return m_hCreateMsgQueue;
}

CuMsgQueue::operator HANDLE() const
    { return (HANDLE)(this == NULL ? NULL : m_hCreateMsgQueue); }

BOOL CuMsgQueue::ReadMsgQueue(LPVOID lpBuffer,
                        DWORD cbBufferSize,
                        LPDWORD lpNumberOfBytesRead,
                        DWORD dwTimeout,
                        DWORD* pdwFlags)
{
    return ::ReadMsgQueue(m_hCreateMsgQueue, lpBuffer, cbBufferSize, lpNumberOfBytesRead, dwTimeout, pdwFlags);
}


像這種 MSGQUEUEOPTIONS msg_queue_options; 有結構設定的部份, 實在很想把他包到類別裡, 在使用函式參數傳遞,並且設定部份參數為預設值!

不僅使用起來美觀! 而且還不用特別去查結構!

沒有留言:

張貼留言