C字符串通过dll边界

时间:2016-04-01 06:31:59

标签: c++ dll c-strings

我们需要以安全的方式通过dll边界返回一个C字符串!我们怎么做到这一点?

我的想法:

extern "C" __declspec(dllexport) const char *const Api
{
    ...
    static const char *output = result.c_str();
    return output;
}

2 个答案:

答案 0 :(得分:1)

在示例代码中返回一个指针,但它指向的内存区域可能不会驻留。

如果结果变量(std :: string?)在堆栈上,当函数返回并且返回的指针悬空时它将被销毁 - 当然不是你想要的。

执行此操作的一种安全方法是strdup()响应,但调用者将负责释放C字符串。卸载DLL意味着返回的指针将悬空,除非它指向堆变量。

答案 1 :(得分:1)

最简单的安全方式是

extern "C"
__declspec(dllexport) 
size_t Api
    (char* dest,
     size_t dest_size)
{
  if (dest) 
    strncpy(dest, str, dest_size);
  return strlen(str);
}

另一种安全的方式是

extern "C"
__declspec(dllexport) 
void Api
    (void (*callback)(const char*))
{
   callback(str);
}

返回malloc'd / new'd内存不是100%安全,因为DLL和主程序可以链接到不同的运行时并使用不同的堆。如果是这种情况,调用者只能通过调用DLL 中的free / delete 来释放/删除内存(并且DLL必须包装那些并导出包装器)。这很麻烦。

返回静态内存不是100%安全的,因为调用者可能存储指针并卸载DLL,在这种情况下指针将悬空。

返回自动内存当然是100%不安全。