库调用c ++ dll失败

时间:2017-05-22 20:52:02

标签: c++ vim dll

vim docs声明我必须为我的所有函数使用C调用约定。 记住这一点,我写了一个最低限度的dll,看看是否一切正常。

#include <string>

std::string _declspec(dllexport) Meow() {
    std::string Meow = "Meow!";
    return Meow;
}

为了编译,我写了一个makefile

test.dll: test.cpp
cl /LD test.cpp
clean: 
    del *.obj
    del *.dll
    del *.exp
    del *.lib

编译时没有任何问题,并将dll复制到我的vim目录中。 在我的理解中通过

调用函数
:call libcall("test.dll","Meow",0)<cr>

应该有效。但我一直收到错误364:“Meow()”库调用失败。 将libcall中的.dll名称更改为不存在的内容会导致相同的错误,因此我得出结论我的dll有问题。 但是我的dll再次编译没有任何问题, 这让我感到困惑。

2 个答案:

答案 0 :(得分:2)

我发现您的代码至少存在两个问题:

  • 在C ++中,名称在导出时通常会被破坏,因此Meow函数将变为?Meow@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ
  • Vim docs似乎声明使用libcall调用的函数必须符合一些相当严格的条件:
  

该函数必须只接受一个参数,字符指针或长整数,并且必须返回字符指针或NULL。返回的字符指针必须指向在函数返回后仍然有效的内存(例如,在DLL中的静态数据中)。

答案 1 :(得分:0)

以下内容应修复您的示例:

extern "C"
{  
    static char null_terminated_string[2048];
    char* _declspec(dllexport) Meow(char *arg) 
    {
        strncpy(null_terminated_string, arg, std::min(sizeof(null_terminated_string), strlen(arg));
        return null_terminated_string;
    }
}