C++调用DLL错误笔记

Posted 不溯流光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++调用DLL错误笔记相关的知识,希望对你有一定的参考价值。

(1)尝试读取或写入受保护的内存,这通常指示其他内存已损坏

可能原因:

1、传入的数组长度开的太小了;

2、传入参数没有加ref。

 

(2)无法打开文件“xxx.lib”错误的解决办法

https://blog.csdn.net/weixin_36212725/article/details/99940844

 

(3)编译错误unresolved external symbol __imp__SetupDiDestroyDeviceInfoList@4

 

unresolved external symbol __imp__SetupDiDestroyDeviceInfoList@4

error LNK2001: unresolved external symbol __imp__SetupDiGetDeviceRegistryPropertyA@28
error LNK2001: unresolved external symbol __imp__SetupDiEnumDeviceInfo@12
error LNK2001: unresolved external symbol __imp__SetupDiGetClassDevsA@16

解决方法:

1、在程序的头部加上 #pragma comment(lib,"setupapi")

2、Project--Settings--Link

 

 

(4)C#调用DLL时提示:未找到指定模块

1、检查DLL中是否有该函数,并有调用接口;

2、DLL中可能有调用其他的DLL,但调用时未查找到。

比如一个集合了操作示波器、万用表等设备函数接口的DLL,使用时往往需要先在电脑上安装示波器、万用表的使用环境(驱动等)。

如果电脑上安装了万用表的环境,没有安装示波器的环境,即使调用该DLL时只是调用了操作万用表的函数,也是会提示找不到模块的。

3、C:\\Windows\\System32或C:\\Windows\\SysWOW64中缺少DLL

像是MSVCP60D.DLL、MSVCRTD.DLL这种。一般这些DLL安装了VC6.0应该就可以。

4、在将用VS2008编写的WinForm项目转为VS2013项目后,调用dll报该错

尝试将用VC6 C++编写的dll项目转为VS2013项目,同时在WinForm项目内写调用接口时,加上

[DllImport("xxx.dll", SetLastError = true,CallingConvention=CallingConvention.Cdecl)]

 

参考:https://blog.csdn.net/jing_cs/article/details/78559508

 

(5)VC6 C++项目转VS2013项目

用VS2013打开.dsw文件,重新生成时可能出现错误,则修改项目属性:

 

 

 

修改后可能还会出现错误:

无法打开源文件 "winsock2.h";
应输入标识符 意外的标记位于“;”之前;

这些错误并不是出现在我们自己写的.h文件中,可能是setupapi.h之类的文件,他们中的某些变量名称和自己写的 .h文件相同了,所以可以改一下我们自己的.h文件的定义。

 

(6)程序在32位操作系统上运行正常,在64位操作系统上运行读卡功能提示“试图加载格式不正确”

点击项目属性,把目标平台Any CPU 设置为X86。

 

调用DLL时出现的错误总结:https://blog.csdn.net/qq_22654855/article/details/113456374

/*******相与枕藉乎舟中,不知东方之既白*******/

以上是关于C++调用DLL错误笔记的主要内容,如果未能解决你的问题,请参考以下文章

使用指针调用 C++ DLL 函数

C++ MSVC dll 编译错误缺少类型说明符和重新定义

C++ DLL 返回从 Python 调用的指针

从 C# 调用 C++ dll 并抛出 SEHException

从 Delphi“访问冲突”正确调用 DLL 中的 C++ 函数

使用 loadLibrary() 在 java 中调用 c++ dll