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再次编译没有任何问题, 这让我感到困惑。
答案 0 :(得分:2)
我发现您的代码至少存在两个问题:
Meow
函数将变为?Meow@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ
。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;
}
}