库调用失败 c++ dll

Library call failed c++ dll

本文关键字:dll c++ 失败 调用      更新时间:2023-10-16

vim 文档指出,我必须对所有函数使用 C 调用约定。考虑到这一点,我写了一个最低限度的dll,只是为了看看是否一切正常。

#include <string>
std::string _declspec(dllexport) Meow() {
    std::string Meow = "Meow!";
    return Meow;
}

为了编译,我写了一个制作文件

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编译没有任何问题,这让我感到困惑。

我看到你的代码至少有两个问题:

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

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

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

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;
    }
}