库调用失败 c++ dll
Library call failed c++ dll
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;
}
}
相关文章:
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- 从DLL中删除类的实例
- 如何包装第三方DLL在R中使用
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Python ctypes:不会按预期加载 dll
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL