菜鸟小杰 发表于 2026-8-13 22:38:34

动态链接库问题

这个指针为什么返回到参数 就销毁了 怎么保留返回到参数返回值是可以的

菜鸟小杰 发表于 2026-8-13 23:47:42

真费劲 没人吗

icky01 发表于 2026-8-14 08:13:02

用读指针处对象,再加入文本

Xelloss0618 发表于 2026-8-14 09:43:22

常识啊。
一、你的指针指向的对象是局部数据,执行完那一行就会被销毁;
二、DLL 返回参数需要用指针;

你的写法要参考系统API,主要是两个方式。
A:调用前申请内存,将指针传给 DLL,DLL 将数据复制到指针中;
B:DLL 申请内存,写入数据后返回指针,DLL 还需要另外写一个方法来释放指针;

还有其他小问题,这种场景,文本到多字节第二个参数应该用真,不过也能跑。

菜鸟小杰 发表于 2026-8-14 17:09:36

用文本型 也不行 我是易调用火山DLL火山返回有数据 易返回空 其他函数正常

Xelloss0618 发表于 2026-8-14 22:29:10

DLL用文本型,火山内部是直接转换成文本指针的,所以也不能拿来返回东西

<火山程序 类型 = "通常" 版本 = 1 />

方法 验证1 <公开 静态 类型 = 整数 折叠 @输出名 = "Software" @视窗.输出 = 真>
参数 云版本 <类型 = 变整数 注释 = "传变整数变量地址">
{
    如果 (云版本 == 0)// 空指针
    {
      返回 (0)
    }
    变量 _云版本 <类型 = 字节集类>
    变量 _地址 <类型 = 变整数>
    _云版本 = 文本到多字节 ("1.2.3")
    _地址 = 分配内存 (_云版本.取字节集长度 ())
    内存复制 (_地址, _云版本.取字节集指针 (), _云版本.取字节集长度 ())
    写指针处值 (云版本, _地址)
    返回 (1)
}

方法 释放1 <公开 静态 折叠 @输出名 = "FreeStr‌" @视窗.输出 = 真>
参数 文本地址 <类型 = 变整数>
{
    如果 (文本地址 != 0)
    {
      释放内存 (文本地址)
    }
}

方法 验证2 <公开 静态 类型 = 整数 折叠 @输出名 = "Software2" @视窗.输出 = 真>
参数 云版本 <类型 = 变整数 注释 = "传文本指针">
{
    如果 (云版本 == 0)// 空指针
    {
      返回 (0)
    }
    变量 _云版本 <类型 = 字节集类>
    _云版本 = 文本到多字节 ("1.2.3")
    内存复制 (云版本, _云版本.取字节集指针 (), _云版本.取字节集长度 ())
    返回 (1)
}

方法 调用例子 <公开 注释 = "火山例子,易语言也差不多" 折叠>
{
    变量 文本地址 <类型 = 变整数>
    变量 云版本 <类型 = 文本型>
    // 方案1
    验证1 (取变量地址 (文本地址))
    云版本 = 多字节指针到文本 (文本地址)
    释放1 (文本地址)// 用完释放
    调试输出 (云版本)
    // 方案2
    文本地址 = 分配内存 (1024)// 要预分配足够的内存
    验证2 (文本地址)
    云版本 = 多字节指针到文本 (文本地址)
    释放内存 (文本地址)
    调试输出 (云版本)
    // 两个方案的区别就是谁申请内存谁释放,EXE端申请内存要先确定大小
}
页: [1]
查看完整版本: 动态链接库问题