在DLL方法中返回C字符串

时间:2012-03-28 01:42:13

标签: c dll

我正在尝试创建一个C风格的DLL接口,它接受输入char *并在执行一些转换操作后分配输出char *。函数的返回值是错误代码,因此它不会用于返回char *。

我以这种方式调用函数:

char* output;
myfunc((char *) input.c_str(), &output);

该功能定义为:

DLL_EXPORT int myfunc(char* input, char** output)
{
    string translation = translate(input);
    *output = (char *) malloc((translation.length()+1)*sizeof(char));
    strcpy(*output,(char *) translation.c_str());
}

这是实现此目的的正确方法吗?我是否在创建内存泄漏?

2 个答案:

答案 0 :(得分:2)

这是正确的,但你还需要提供另一个释放内存的DLL函数。您不能假设已加载DLL的可执行文件使用相同版本的C运行时库,因此如果它尝试在返回的内存上调用free,您可能最终会因为差异而损坏堆不同运行时的malloc / free实现。

您的API应如下所示:

DLL_EXPORT int myfunc(char* input, char** output)
{
    ...
    *output = malloc(...);
    ...
}

DLL_EXPORT void myfunc_free(char *output)
{
    free(output);
}

另见allocating and freeing memory across module boundaries

答案 1 :(得分:0)

永远不要假设您将通过调用app和dll使用相同的堆空间。在这种情况下,您必须使用Windows Shared Memory object