luminous夜光 发表于 2023-9-1 17:31:15

视窗平台dll 返回文本问题

视窗平台dll 目前有什么好办法向外传递文本字符串吗,需要C++调用dll,有无demo可以看看

urenai 发表于 2023-9-1 17:45:01

getclassname api


总的来讲就是,申请内存,传入指针,内部写入数据后返回。
外部操作这个指针得到数据,然后 释放。

创世魂 发表于 2023-9-1 20:03:59

通过指针传递。。变整数

luminous夜光 发表于 2023-9-1 20:56:53

创世魂 发表于 2023-9-1 20:03
通过指针传递。。变整数

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

Xelloss0618 发表于 2023-9-1 21:56:43

<火山程序 类型 = "通常" 版本 = 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;
#   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:57

火山的文本类型不好用,不如易语言

luminous夜光 发表于 2023-9-3 00:23:39

Xelloss0618 发表于 2023-9-1 21:56
# 方法一

方法 返回文本1


感谢,我试一试
页: [1]
查看完整版本: 视窗平台dll 返回文本问题