开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 462|回复: 1
收起左侧

[求助] 关于内存映射与c++通讯的问题

[复制链接]
结帖率:100% (2/2)
发表于 2023-11-27 15:51:00 | 显示全部楼层 |阅读模式   湖南省娄底市
是这样的我最近在研究易语言和c++的opencv检测通讯 用的是内存映射 写入内存的路径文本例如模型文件和图片文件 写入进去后c++这边正确读取到没其他毛病,但是我写入字节集图片 在c++那边读取总是读取不对不知道为什么


易语言写入代码:
  
子程序名返回值类型公开备 注
写入 如果中文请转uft8编码
参数名类 型参考可空数组备 注
Name文本型
Data字节集
变量名类 型静态数组备 注
hwnd整数型 
LPSTR整数型 
len整数型 
lenx整数型 
Datas字节集 
len = 取字节集长度 (Data)
lenx = len + 4
Datas = 到字节集 (len) + Data
hwnd = OpenFileMappingA (2, 1, Name)
LPSTR = MapViewOfFile (hwnd, 2, 0, 0, 0)  ' FILE_MAP_WRITE = 2
写到内存 (Datas, LPSTR, lenx)
UnmapViewOfFile (LPSTR)


C++读取代码:
[C++] 纯文本查看 复制代码
unsigned char* ReadData_E_char(LPCSTR name)
{
        HANDLE handle = OpenFileMappingA(FILE_MAP_READ, FALSE, name);
        if (handle == NULL) {
                return NULL;
        }

        LPVOID m_LPSTR = MapViewOfFile(handle, FILE_MAP_READ, 0, 0, 0);
        if (m_LPSTR == NULL) {
                CloseHandle(handle);
                return NULL;
        }

        // 获取主数据长度  
        DWORD dataSize = *(DWORD*)m_LPSTR;//487438

        // 获取数据指针  
        LPVOID data = (LPVOID)((DWORD_PTR)m_LPSTR + sizeof(DWORD));
        // 获取数据内容  
        unsigned char m_data = (unsigned char)data;


        UnmapViewOfFile(m_LPSTR);
        CloseHandle(handle);

        return (unsigned char*)m_data;
}



然后我c++中使用
unsigned char* imgeData = ReadData_E_char("OpenCV_TensorRT_imgData");// 图片数据
// 创建一个Mat对象,使用图像数据初始化  
cv::Mat img = cv::Mat(dstw, dsth, CV_8UC3, imgeData);


这样不是报错就是读出来是错误的乱码

ReadData_E_char这个方法读取到的数据应该是正确的 因为我遍历了一下数据 正常有内容 而且我读取到的数据长度dataSize 也是正确的
但还是会出错  求大佬们教教是哪里出错了
结帖率:100% (2/2)
 楼主| 发表于 2023-11-28 15:16:19 | 显示全部楼层   湖南省娄底市
已自行解决以下是我的解决方法:C++代码更改为:
[C++] 纯文本查看 复制代码
std::vector<uchar> ReadData_E_char(LPCSTR name)
{
        HANDLE handle = OpenFileMappingA(FILE_MAP_READ, FALSE, name);
        if (handle == NULL) {
                return std::vector<uchar>();
        }

        LPVOID data = MapViewOfFile(handle, FILE_MAP_READ, 0, 0, 0);
        if (data == NULL) {
                CloseHandle(handle);
                return std::vector<uchar>();
        }

        // 获取主数据长度  
        DWORD dataSize = *(DWORD*)data;
        std::cerr << dataSize << std::endl;//487438

        // 获取数据指针  
        data = (LPVOID)((DWORD_PTR)data + sizeof(DWORD));
        // 获取数据内容  
        //unsigned char* m_data = (unsigned char*)data;

        // 获取数据内容,并存储到vector中    
        std::vector<uchar> m_data(dataSize);
        memcpy(m_data.data(), data, dataSize);

        //// 遍历m_data并输出每个字节的十进制值  
        //for (int i = 0; i < dataSize; i++) {
        //        std::cout << static_cast<int>(m_data) << " ";
        //}

        UnmapViewOfFile(data);
        CloseHandle(handle);

        return m_data;
}


并且读取数据后需要进行解码
[C++] 纯文本查看 复制代码
std::vector<uchar> imgeData = ReadData_E_char("OpenCV_TensorRT_imgData");// 图片数据
        // 解码图像  
        cv::Mat image;
        image = cv::imdecode(imgeData, 1); // 解码图像

        // 创建窗口并显示图像  
        cv::imshow("Image", image);
        // 等待按键事件  
        cv::waitKey(0);


回复 支持 反对

使用道具 举报

  高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表