递归火山软件开发平台

标题: 视窗平台dll 返回文本问题 [打印本页]

作者: luminous夜光    时间: 2023-9-1 17:31
标题: 视窗平台dll 返回文本问题
视窗平台dll 目前有什么好办法向外传递文本字符串吗,需要C++调用dll,有无demo可以看看

作者: urenai    时间: 2023-9-1 17:45
getclassname api


总的来讲就是,申请内存,传入指针,内部写入数据后返回。
外部操作这个指针得到数据,然后 释放。
作者: 创世魂    时间: 2023-9-1 20:03
通过指针传递。。变整数
作者: luminous夜光    时间: 2023-9-1 20:56
创世魂 发表于 2023-9-1 20:03
通过指针传递。。变整数

请问下有示例dmeo吗,不是很清楚指针怎么用

作者: Xelloss0618    时间: 2023-9-1 21:56
<火山程序 类型 = "通常" 版本 = 1 />

# 方法一

方法 返回文本1 <公开 静态 类型 = 变整数 注释 = "返回局部静态变量的文本指针" 注释 = "优点: 简单易用"
        注释 = "缺点: 第二次调用方法,之前返回的文本指针就会失效,因此必须马上复制返回的文本数据;" 注释 = "非线程安全" 返回值注释 = "C++类型 const wchar_t*" 折叠
        @输出名 = "GetStr1" @视窗.输出 = 真>
参数 参数 <类型 = 整数>
{
    变量 文本内容 <静态 类型 = 文本型 注释 = "必须静态">
    文本内容 = "返回的文本" + 到文本 (参数)
    返回 (取文本指针 (文本内容))
}

# C++调用方法:
#     std::wstring wstr = GetStr1(123); // 这样赋值,文本指针的数据就会复制到 std::wstring 中
# ----
# 方法二

方法 返回文本2 <公开 静态 类型 = 变整数 注释 = "DLL方申请内存,并返回文本指针" 注释 = "优点: 简单易用,线程安全" 注释 = "缺点: 需要多调用一条命令释放文本数据"
        返回值注释 = "C++类型 const wchar_t*" 折叠 @输出名 = "GetStr2" @视窗.输出 = 真>
参数 参数 <类型 = 整数>
{
    变量 文本内容 <类型 = 文本型>
    变量 文本指针 <类型 = 变整数>
    变量 数据大小 <类型 = 整数>
    文本内容 = "返回的文本" + 到文本 (参数)
    数据大小 = (取文本长度 (文本内容) + 1) * 2  // 文本数据占用的内存大小为 (文本字符数 + 1) * 2
    文本指针 = 分配内存 (数据大小)
    内存复制 (文本指针, 取文本指针 (文本内容), 数据大小)
    返回 (文本指针)
}

方法 释放文本 <公开 静态 注释 = "释放\"返回文本2\"返回的文本数据" 返回值注释 = "C++类型 const wchar_t*" 折叠 @输出名 = "FreeStr" @视窗.输出 = 真>
参数 文本指针 <类型 = 变整数 注释 = "必须是\"DLL返回文本\"返回的文本指针">
{
    释放内存 (文本指针)
}

# C++调用方法:
#     const wchar_t* pdata = GetStr2(123);
#     std::wstring wstr = pdata;
#     FreeStr(pdata);
# ----
# 方法三

方法 返回文本3 <公开 静态 注释 = "调用方申请内存" 注释 = "优点: 安全,这是DLL的标准写法" 注释 = "缺点: 用法比较复杂" 折叠 @输出名 = "GetStr3"
        @视窗.输出 = 真>
参数 参数 <类型 = 整数>
参数 文本指针 <类型 = 变整数 注释 = "wchar_t* 传0表示只返回文本长度">
参数 长度指针 <类型 = 变整数 注释 = "int* 单位为宽字符数量">
{
    变量 文本内容 <类型 = 文本型>
    文本内容 = "返回的文本" + 到文本 (参数)
    如果 (文本指针 == 0 || 读指针处值 (长度指针, 整数) < 取文本长度 (文本内容))
    {
        写指针处值 (长度指针, (整数)取文本长度 (文本内容))
        返回
    }
    写指针处值 (长度指针, (整数)取文本长度 (文本内容))
    内存复制 (文本指针, 取文本指针 (文本内容), (取文本长度 (文本内容) + 1) * 2)
}

# C++调用方法1:
#     int len = 0;
#     GetStr3(123, nullptr, &len); // 第一次取文本长度
#     wchar_t* pstr = new wchar_t[len + 1];
#     GetStr3(123, pstr, &len); // 第二次获取文本数据
#     ...
#     delete pstr; // 使用后需要手动释放
# C++调用方法2:
#     std::wstring wstr;
#     int len = 0;
#     GetStr3(123, nullptr, &len); // 第一次取文本长度
#     wstr.resize(len);
#     GetStr3(123, wstr.data(), &len); // 第二次获取文本数据

作者: hmyroot    时间: 2023-9-2 10:02
火山的文本类型不好用,不如易语言
作者: luminous夜光    时间: 2023-9-3 00:23
Xelloss0618 发表于 2023-9-1 21:56
# 方法一

方法 返回文本1

感谢,我试一试




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4