exe和dll之间的c ++调用出错

时间:2016-07-09 07:44:23

标签: c++

我很遗憾这个c ++错误。

我有一个" exe"它导出" .lib",并加载" dll"导入此" .lib"。我可以用这个方法解决问题。但是当我使用" EscapeJson"时,会出现异常。如果我将代码复制到库中并替换" CoreHelper :: EscapeJson"与" EscapeJson" (同一个图书馆)一切都好......

出了什么问题?

My.EXE (Export) -> My.lib (Import) -> MyDll.dll
   ^                                      |
   `---------------------------------------

Error

此代码也有效,因为" EscapeJson"成功返回值...

But code works

Escape Json Source

std::string CoreHelper::EscapeJson(char * input, int length)
{
    std::ostringstream o;
    for (int x = 0; x < length; x++)
    {
        char c = input[x];
        switch (c)
        {
        case '"': o << "\\\""; break;
        case '\\': o << "\\\\"; break;
        case '\b': o << "\\b"; break;
        case '\f': o << "\\f"; break;
        case '\n': o << "\\n"; break;
        case '\r': o << "\\r"; break;
        case '\t': o << "\\t"; break;
        default:
            if ('\x00' <= c && c <= '\x1f')
            {
                o << "\\u"
                    << std::hex << std::setw(4) << std::setfill('0') << (int)c;
            }
            else
            {
                o << c;
            }
        }
    }
    return o.str();
}

1 个答案:

答案 0 :(得分:1)

您无法跨DLL边界传递std::string(或几乎任何其他非POD类型)。在这种情况下,std::string的原始内存在EXE内部分配,并由编译到EXE中的内存管理器管理。 DLL将无法正确释放它,只有EXE可以。

您需要使用跨DLL边界安全使用的互操作数据类型和内存管理技术。

在这种情况下,请尝试更类似的内容:

char* CoreHelper::EscapeJson(char * input, int length)
{
    std::ostringstream o;
    //...
    std::string s = o.str();
    char *res = new char[s.size()+1];
    std::copy(s.begin(), s.end(), res);
    res[s.size()] = 0;
    return res;
}

void CoreHelper::FreeEscapedJson(char * input)
{
    delete [] input;
}

char *str = CoreHelper::EscapeJson(...);
// use str as needed...
CoreHelper::FreeEscapedJson(str);