Thursday 12 January 2023

 Buffer Data Into Image Using Memcopy-OpenCV

 Buffer Data Convert as Image Using OpenCV


                                          Code
Code version v0.1
---------------------------------------------------------------------------------------------------------------------------


#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>

HANDLE hSlot;
LPCTSTR SlotName = TEXT("\\\\.\\mailslot\\mailslot");

BOOL ReadSlot()
{
    DWORD cbMessage, cMessage, cbRead;
    BOOL fResult;
    LPTSTR lpszBuffer;
    TCHAR achID[80];
    DWORD cAllMessages;
    HANDLE hEvent;
    OVERLAPPED ov;

    cbMessage = cMessage = cbRead = 0;

    hEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("ExampleSlot"));
    if (NULL == hEvent)
        return FALSE;
    ov.Offset = 0;
    ov.OffsetHigh = 0;
    ov.hEvent = hEvent;

    fResult = GetMailslotInfo(hSlot, // mailslot handle
        (LPDWORD)NULL,               // no maximum message size
        &cbMessage,                   // size of next message
        &cMessage,                    // number of messages
        (LPDWORD)NULL);              // no read time-out

    if (!fResult)
    {
        printf("GetMailslotInfo failed with %d.\n", GetLastError());
        return FALSE;
    }

    if (cbMessage == MAILSLOT_NO_MESSAGE)
    {
        printf("Waiting for a message...\n");
        return TRUE;
    }

    cAllMessages = cMessage;

    while (cMessage != 0)  // retrieve all messages
    {
        // Allocate memory for the message.

        lpszBuffer = (LPTSTR)GlobalAlloc(GPTR,
            lstrlen((LPTSTR)achID) * sizeof(TCHAR) + cbMessage);
        if (NULL == lpszBuffer)
            return FALSE;
        lpszBuffer[0] = '\0';

        fResult = ReadFile(hSlot,
            lpszBuffer,
            cbMessage,
            &cbRead,
            &ov);

        if (!fResult)
        {
            printf("ReadFile failed with %d.\n", GetLastError());
            GlobalFree((HGLOBAL)lpszBuffer);
            return FALSE;
        }
        cv::Mat mat = cv::Mat(640, 640, CV_8UC3, cv::Scalar(0, 0, 0));
        std::memcpy(mat.data, lpszBuffer, 640 * 640 * 3);
      
        cv::imshow("YOURWINDOW", mat);
        cv::waitKey(1);

        GlobalFree((HGLOBAL)lpszBuffer);

        fResult = GetMailslotInfo(hSlot,  // mailslot handle
            (LPDWORD)NULL,               // no maximum message size
            &cbMessage,                   // size of next message
            &cMessage,                    // number of messages
            (LPDWORD)NULL);              // no read time-out

        if (!fResult)
        {
            printf("GetMailslotInfo failed (%d)\n", GetLastError());
            return FALSE;
        }
    }
    CloseHandle(hEvent);
    return TRUE;
}


BOOL WINAPI MakeSlot(LPCTSTR lpszSlotName)
{
    hSlot = CreateMailslot(
        lpszSlotName,
        0,
        MAILSLOT_WAIT_FOREVER,
        (LPSECURITY_ATTRIBUTES)NULL);

    if (hSlot == INVALID_HANDLE_VALUE) {
        printf("CreateMailslot failed with %d\n", GetLastError());
        return FALSE;
    }
    else
        std::cout << "Mailslot created successfully.\n";
    return TRUE;
}

int main()
{
    MakeSlot(SlotName);


    cv::namedWindow("YOURWINDOW", cv::WINDOW_AUTOSIZE);
    while (true) {
        ReadSlot();
    }
}

// producer:

LPCTSTR SlotName = TEXT("\\\\.\\mailslot\\mailslot");

BOOL WriteSlot(HANDLE hSlot, LPCTSTR lpszMessage)
{
    BOOL fResult;
    DWORD cbWritten;

    fResult = WriteFile(hSlot, lpszMessage,
                (DWORD)(lstrlen(lpszMessage) + 1) * sizeof(TCHAR),
                &cbWritten, (LPOVERLAPPED)NULL);

    if (!fResult) {
        printf("WriteFile failed with %d.\n", GetLastError());
        return FALSE;
    }

    printf("Slot written to successfully.\n");

    return TRUE;
}
cv::Mat mat =
        cv::imread("C:\\Repos\\tmp\\decode\\images\\output_0664.jpg");
            size_t sizeInBytes = mat.step[0] * mat.rows;

            LPVOID lpBuffer = malloc(sizeInBytes);

            HANDLE hFile;

            hFile = CreateFile(SlotName, GENERIC_WRITE,
                       FILE_SHARE_READ,
                       (LPSECURITY_ATTRIBUTES)NULL,
                       OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
                       (HANDLE)NULL);

            if (hFile == INVALID_HANDLE_VALUE) {
                printf("CreateFile failed with %d.\n",
                       GetLastError());
                return FALSE;
            }
            DWORD bytesWritten;
            memcpy(lpBuffer, &mat.data[0], sizeInBytes);

            WriteFile(hFile, lpBuffer, sizeInBytes, &bytesWritten,
                  NULL);

            CloseHandle(hFile);
 
 
 
 
 
Code Version V0.2:
-----------------------------------------------------------------------------------------------


#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>

HANDLE hSlot;
LPCTSTR SlotName = TEXT("\\\\.\\mailslot\\mailslot");

BOOL ReadSlot()
{
    DWORD cbMessage, cMessage, cbRead;
    BOOL fResult;
    LPTSTR lpszBuffer;
    TCHAR achID[80];
    DWORD cAllMessages;
    HANDLE hEvent;
    OVERLAPPED ov;

    cbMessage = cMessage = cbRead = 0;

    hEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("ExampleSlot"));
    if (NULL == hEvent)
        return FALSE;
    ov.Offset = 0;
    ov.OffsetHigh = 0;
    ov.hEvent = hEvent;

    fResult = GetMailslotInfo(hSlot, // mailslot handle
        (LPDWORD)NULL,               // no maximum message size
        &cbMessage,                   // size of next message
        &cMessage,                    // number of messages
        (LPDWORD)NULL);              // no read time-out

    if (!fResult)
    {
        printf("GetMailslotInfo failed with %d.\n", GetLastError());
        return FALSE;
    }

    if (cbMessage == MAILSLOT_NO_MESSAGE)
    {
        printf("Waiting for a message...\n");
        return TRUE;
    }

    cAllMessages = cMessage;

    while (cMessage != 0)  // retrieve all messages
    {
        // Allocate memory for the message.

        lpszBuffer = (LPTSTR)GlobalAlloc(GPTR,
            lstrlen((LPTSTR)achID) * sizeof(TCHAR) + cbMessage);
        if (NULL == lpszBuffer)
            return FALSE;
        lpszBuffer[0] = '\0';

        fResult = ReadFile(hSlot,
            lpszBuffer,
            cbMessage,
            &cbRead,
            &ov);

        if (!fResult)
        {
            printf("ReadFile failed with %d.\n", GetLastError());
            GlobalFree((HGLOBAL)lpszBuffer);
            return FALSE;
        }
        cv::Mat mat = cv::Mat(640, 640, CV_8UC3, cv::Scalar(0, 0, 0));
        std::memcpy(mat.data, lpszBuffer, 640 * 640 * 3);
      
        cv::imshow("YOURWINDOW", mat);
        cv::waitKey(1);

        GlobalFree((HGLOBAL)lpszBuffer);

        fResult = GetMailslotInfo(hSlot,  // mailslot handle
            (LPDWORD)NULL,               // no maximum message size
            &cbMessage,                   // size of next message
            &cMessage,                    // number of messages
            (LPDWORD)NULL);              // no read time-out

        if (!fResult)
        {
            printf("GetMailslotInfo failed (%d)\n", GetLastError());
            return FALSE;
        }
    }
    CloseHandle(hEvent);
    return TRUE;
}


BOOL WINAPI MakeSlot(LPCTSTR lpszSlotName)
{
    hSlot = CreateMailslot(
        lpszSlotName,
        0,
        MAILSLOT_WAIT_FOREVER,
        (LPSECURITY_ATTRIBUTES)NULL);

    if (hSlot == INVALID_HANDLE_VALUE) {
        printf("CreateMailslot failed with %d\n", GetLastError());
        return FALSE;
    }
    else
        std::cout << "Mailslot created successfully.\n";
    return TRUE;
}

int main()
{
    MakeSlot(SlotName);


    cv::namedWindow("YOURWINDOW", cv::WINDOW_AUTOSIZE);
    while (true) {
        ReadSlot();
    }
}

// producer:

LPCTSTR SlotName = TEXT("\\\\.\\mailslot\\mailslot");

BOOL WriteSlot(HANDLE hSlot, LPCTSTR lpszMessage)
{
    BOOL fResult;
    DWORD cbWritten;

    fResult = WriteFile(hSlot, lpszMessage,
                (DWORD)(lstrlen(lpszMessage) + 1) * sizeof(TCHAR),
                &cbWritten, (LPOVERLAPPED)NULL);

    if (!fResult) {
        printf("WriteFile failed with %d.\n", GetLastError());
        return FALSE;
    }

    printf("Slot written to successfully.\n");

    return TRUE;
}
cv::Mat mat =
        cv::imread("C:\\Repos\\tmp\\decode\\images\\output_0664.jpg");
            size_t sizeInBytes = mat.step[0] * mat.rows;

            LPVOID lpBuffer = malloc(sizeInBytes);

            HANDLE hFile;

            hFile = CreateFile(SlotName, GENERIC_WRITE,
                       FILE_SHARE_READ,
                       (LPSECURITY_ATTRIBUTES)NULL,
                       OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
                       (HANDLE)NULL);

            if (hFile == INVALID_HANDLE_VALUE) {
                printf("CreateFile failed with %d.\n",
                       GetLastError());
                return FALSE;
            }
            DWORD bytesWritten;
            memcpy(lpBuffer, &mat.data[0], sizeInBytes);

            WriteFile(hFile, lpBuffer, sizeInBytes, &bytesWritten,
                  NULL);

            CloseHandle(hFile);