2017-05-22 76 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 –