2017-05-22 27 views
0

vim docsは、すべての関数にCの呼び出し規約を使用しなければならないと述べています。 これは、すべてが大丈夫かどうかを確認するために最低限のDLLを書いたことを念頭に置いています。私はメイク問題なくコンパイルライブラリ呼び出しが失敗しました。C++ dll

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

を書いて、私のvimのディレクトリにDLLをコピーしコンパイルするための

#include <string> 

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

。 私の理解では、

:call libcall("test.dll","Meow",0)<cr> 

によって関数を呼び出す必要があります。しかし、私はエラー364を取得し続けます: "Meow()"のライブラリ呼び出しに失敗しました。 libcall内の.dll名を変更すると、同じエラーが発生するため、私はdllに何か問題があるとの結論に至りました。 しかし、私のdllは問題なくコンパイルされています。 私は困惑しています。

答えて

2

私はあなたのコードを有する少なくとも2つの問題を参照してください。エクスポートしたとき、あなたのMeow機能が[email protected]@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@XZのようなものになりますので、一般的にマングルされ得るC++の名前で

  • を。関数は、文字ポインタまたは長整数のいずれかを、正確に一つのパラメータを取る必要があり、文字のポインタを返す必要があり

  • Vim docslibcallで呼び出され、その関数は、いくつかのかなりの制約条件に一致する必要があります述べるように見えますまたはNULLです。返される文字ポインタは、関数が返された後も有効なままであるメモリを指していなければなりません(DLLの静的データなど)。

  • +0

    Oooohhh、私は名前マングリングを防ぐために、文字ポインタと追加のextern「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 –

    関連する問題