TC官方合作论坛

 找回密码
 立即注册
查看: 2323|回复: 10

bmp。1易语言字节集,跟其它语言怎样关联

[复制链接]
发表于 2024-10-7 11:05:01 来自手机 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 剑仙十号 于 2024-10-7 11:29 编辑

bmp。1易语言字节集,跟其它语言怎样关联

TC:
var 数据长度 = 100
var 内存地址 = 结构体申请内存(数组("byte" = 数据长度, "value" = null))
结构体释放内存(内存地址)

’其它语言,把内存地址, 数据长度 传入到易语言DLL。再转换成易的字节集变量.
字节集名=指针到字节集(内存地址, 数据长度)

’在易语言DLL中,获取字节集变量_的内存地址, 数据长度,再输出给其它语言。
内存地址=取变量地址(字节集名[1])’获得字节集数据的内存地址
数据长度=取字节集长度(字节集名)
回复

使用道具 举报

 楼主| 发表于 2024-10-14 22:06:05 来自手机 | 显示全部楼层
yuzhiboqianyuan 发表于 2024-10-11 15:29
就是如何表示这里的 读入文件 函数

请用C++写出上面API组合代码
.
以下是使用C++编写的代码示例,展示了如何使用上述API组合将文件内容加载到内存缓冲区:
.
```cpp
#include <iostream>
#include <Windows.h>

int main() {
    // 打开文件
    HANDLE hFile = CreateFile(
        "example.txt",                 // 文件路径
        GENERIC_READ,                  // 打开方式:只读
        FILE_SHARE_READ,               // 共享访问权限:允许其他进程读取
        NULL,                          // 安全属性(默认)
        OPEN_EXISTING,                 // 打开选项:已存在的文件
        FILE_ATTRIBUTE_NORMAL,         // 文件属性:普通文件
        NULL                           // 模板文件句柄(不使用)
    );

    if (hFile == INVALID_HANDLE_VALUE) {
        std::cerr << "无法打开文件。错误码:" << GetLastError() << std::endl;
        return 1;
    }

    // 创建文件映射对象
    HANDLE hMapFile = CreateFileMapping(
        hFile,                         // 文件句柄
        NULL,                          // 安全属性(默认)
        PAGE_READONLY,                 // 保护类型:只读
        0,                             // 高位文件大小(低32位为文件大小)
        0,                             // 低位文件大小(低32位为文件大小)
        NULL                           // 映射名称(不使用)
    );

    if (hMapFile == NULL) {
        std::cerr << "无法创建文件映射。错误码:" << GetLastError() << std::endl;
        CloseHandle(hFile);
        return 1;
    }

    // 文件映射视图到内存
    LPVOID lpbuffer = MapViewOfFile(
        hMapFile,                      // 文件映射对象的句柄
        FILE_MAP_READ,                 // 访问权限:只读
        0,                             // 高位偏移量(低32位为偏移量)
        0,                             // 低位偏移量(低32位为偏移量)
        0                              // 映射视图的大小(0表示整个文件)
    );
//lpbuffer 是32位指针,里面装缓冲区的内存地址.
    if (lpbuffer == NULL) {
        std::cerr << "文件映射视图失败。错误码:" << GetLastError() << std::endl;
        CloseHandle(hMapFile);
        CloseHandle(hFile);
        return 1;
    }

    // 在此处,可以使用lpbuffer指针访问文件内容
    // 易语言 在DLL命令名。yolo5_detect( )的参数2 data。把数据类型,从字节集 修改成 整数型。TC的dllcall( ) 里面,直接声明为"long"类型.
    // 易语言 在yolo5_detect( ) 调用行,lpbuffer定义成整数型,lpbuffer传入yolo5_detect( )的参数2。TC的dllcall( ) 调用行,直接传入lpbuffer.

    // 解除映射视图,和关闭文件映射对象句柄
    //UnmapViewOfFile(lpbuffer);//解除映射视图OfFile。我们需要用到lpbuffer,暂时不解除.
    CloseHandle(hMapFile);
    CloseHandle(hFile);
    return 0;
}
```
请注意,此示例假设您已经有一个名为`example.txt`的文件存在于程序运行的目录中。在实际使用时,请确保替换为您要处理的实际文件名,并根据需要调整代码以适应您的具体需求。
.
以上4个API,放到易语言也能调用。
新建一个 读入文件2( ),把4个API封装进去,能够替代 读入文件( )
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2024-10-7 11:06:38 来自手机 | 显示全部楼层
字节集是易语言独有的基本数据类型,按字面的意思来理解,所谓“字节集”就是“字节的集合",其本质就是字节数组。
从计算机基础知识中,我们知道,一个字节就是8位(bit),也就是8个“0”或“1”。计算机中所有的东西(指令和数据)都是用0和1表示的,而以字节作为保存数据的最小单位。
所以,
字节集可以保存任何的数据——数字、文本、声音、图像、可执行文件等等;反过来,一段字节集数据具体表示什么,关键看你是如何解读它。
你可以认为它是一段文本、一张图片或是一首mp3中的一段。
.
首先我们来研究一下“取字节集长度”函数是如何取得一个字节集长度的,因为它的效率,决定了我们是否适合把它放在循环体中执行。
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2024-10-7 11:07:58 来自手机 | 显示全部楼层
易语言的“取字节集长度"函数,并不是蠢蠢地一个字节 一个字节地数,而是把字节集的长度存放在了某个特殊的地方,需要的时候就把它读出来。
那么具体存放在何处呢?这也有几种可能:
①存放在字节集的开始处.
②存放在字节集的末尾处.
③存放在字节集开始处_更前面的位置.
④存放在内存堆栈中的某个表中,然后与指定的字节集变量建立联系。
.
很显然,存放在字节集末尾的可能性很小,不然系统如何知道,一段字节集到何处结束?
.
而如果存放在内存中的表中,需要进行额外的查表操作,显得过于烦琐。
我们先来测试简单的,这也需要做试验。首先我们需要获得字节集数据的内存地址,这个我们可以通过“取变量地址()” 这函数获得。
——就像第一章中“自定义数据类型的内存存储”一节中那样,如果不太清楚,请先转回去看那一节。
//
字节集又叫字节数组。
字节集变量名,又叫数组名。
.
获得字节集变量_的内存地址更简单。
我们只用取字节集的第一个元素的地址,就得到了,不用转来转去那么麻烦。
得到地址之后,我们就看该地址的第一个整数型数据是否是字节集的长度,
如果不是,那显然没有把长度信息放在开头;如果不在开头,我们再把地址指针向内存的低地址方向移动一个整数长度,也就是往前4个字节,我猜想长度信息也有可能存放在那里。具体的试验代码如下:
游客,如果您要查看本帖隐藏内容请回复

回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-7 11:13:06 来自手机 | 显示全部楼层
tc简单开发_爱好群:
433286131 (491/500)

tc简单开发_兴趣群
143358382 (492/500)

tc简单开发_高级群
891069033(168/200)  
教程有连接安卓手机,连接安卓模拟器。
有编程四大F:
1、流程控制,2、变量和数组,
3、函数多线程,4、系统 api函数。
每章十多节。本群大神众多,新手众多,群文件内资源海量。希望新手分享出.更多的学习笔记,减少重复造轮子的时间。
共同学习,共同进步。
回复 支持 反对

使用道具 举报

发表于 2024-10-11 15:07:58 | 显示全部楼层
本帖最后由 yuzhiboqianyuan 于 2024-10-12 10:18 编辑

可以到最后也没有明确说明如何调用易语言的带 字节集变量 参数的核心问题。如果只是这种程度的分享,感觉只是隔靴搔痒罢了,没压意思


下面是一个带易语言字节集类型的dll的分享帖子。

bbs.125.la/thread-14834879-1-1.html
这是对应的资源下载地址:
myqq.lanzoub.com/iiWjF2a5f83e

希望您可以再详细的讲解一下如何调用易语言dll,

kk_20241011152106.jpg
回复 支持 反对

使用道具 举报

发表于 2024-10-11 15:29:33 | 显示全部楼层
kk_20241011152106.jpg
就是如何表示这里的 读入文件 函数
kk_20241011152841.jpg
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-13 15:47:15 来自手机 | 显示全部楼层
yuzhiboqianyuan 发表于 2024-10-11 15:29
就是如何表示这里的 读入文件 函数

哪些win32 API组合,能够把一个文件的字节集,载入内存缓冲区
.
内存映射文件,是由一个文件到一块内存地址的映射。
Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。
.
在Windows编程中,将一个文件的字节集载入内存缓冲区通常涉及使用Win32 API。以下是一个典型的API组合,用于实现这一任务:
.
1. **CreateFile**:这个函数用于打开一个文件,获取文件句柄.以便进行后续的读取操作。
.
2. **CreateFileMapping**:通过文件句柄.创建一个文件映射对象,该对象表示整个文件或文件的一部分。
返回映像的句柄。
.
3. **MapViewOfFile**:通过映像句柄.将文件映射对象的视图映射到进程的地址空间,从而可以在内存中直接访问文件的内容。
返回内存地址。
.
4. **CloseHandle**:关闭文件句柄和文件映射对象句柄,释放资源。
.
综上所述,这些API的组合.允许程序将文件的内容加载到内存缓冲区,而无需一次性读取整个文件。这种方式对于处理大文件特别有用,因为它可以最小化内存使用并提高性能。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-14 10:56:22 来自手机 | 显示全部楼层
获取文件大小
var FSO = com("Scripting.FileSystemObject")
var img_size = FSO.Size("example.txt")
FSO = null
//把img_size传入yolo5_detect( )的参数3.
回复 支持 反对

使用道具 举报

发表于 2024-10-29 12:08:30 | 显示全部楼层
看下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2025-12-15 05:22 , Processed in 0.197258 second(s), 25 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

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