2017-05-22 140 views
0

vim docs声明我必须为我所有的函数使用C调用约定。 考虑到这一点,我写了一个最低限度的dll来查看一切是否正常。库调用失败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> 

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

回答

2

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

函数必须采取恰好一个参数或者是字符指针或一个长整数,并且必须返回一个字符指针或NULL。返回的字符指针必须指向在函数返回后(例如,DLL中的静态数据)保持有效的内存。

+0

Oooohhh,我看到改变的返回类型为一个字符指针,并添加外部的“C”,以防止名字改编和它的工作。感谢队友 –

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

不应该是'extern“C”'? – CristiFati

+0

谢谢@CristiFati –